[python] otázka ohladom mojho štýlu písania v OOP

Roman Beno romanbeno273 na gmail.com
Sobota Leden 12 18:46:35 CET 2013


Dobrý den,

zmienený dokument som už prezeral.
Ako editor používam Stany Python editor, a pri kopírovaní sa kód mohol
trošku zdeformovat (na zarovnanie, zalomenia riadkov atd)..

V mojej otázke som mal viac na mysli, či je vhodné písat jednu velkú metódu
bez atribútov ako program, prípadne viac metód na rozkúskovanie a trochu
sprehladnenie programu, resp. sa snažit aby čast kódu pri vytváranií
instancie triedy (čiže už za dokončením definície triedy) bola čo
najstručnejšia?

Tieto konkrétne informácie som bohužial zatial nikde nenašiel :-(
Ďakujem za odpoved


Dňa 12. január 2013 18:23, Jan Bednařík <jan.bednarik na gmail.com>napísal(-a):

> Ahoj,
>
> v prvé řadě bych doporučil nastudovat si PEP-8, což je doporučení
> (de-facto standard) jak psát kód v Pythonu.
> http://www.python.org/dev/peps/pep-0008/
>
> Honza
>
>
>
> 2013/1/12 Roman Beno <romanbeno273 na gmail.com>
>
>> <http://programujte.com/anonymni-profil/170094/>
>>
>> Dobrý deň,
>>
>> chcel by som sa spýtať na váš názor ohľadne môjho štýlu písania programov
>> v OOP.
>> Rád prijmem akukolvek kritiku, mojim cielom je sa v tomto ohľade zlepšit
>> a v tejto oblasti som si nie som príliš istý.
>>
>> Tu sú ukážky mojich kódov:
>>
>> # -*- coding: utf-8 -*-
>> #################Definícia triedy#######################
>> class Fibonacci:
>>     "Fibonacciho trieda"
>>     def __init__(self,a=0,b=1,pocet_cisiel=10,default=0):
>>         "Vyrobíme stavebný materiál pre fibonaccciho postupnosť."
>>         self.a=a
>>         self.b=b
>>         self.pocet_cisiel=pocet_cisiel
>>         self.default=default
>>     def proces(self):
>>         print(self.a,self.b,end=" ")
>>         while True:
>>             self.a=(self.a+self.b)
>>             self.default+=1
>>             if self.default>=self.pocet_cisiel:
>>                 print("\n")
>>                 break
>>             print(self.a,end=" ")
>>             # postupnost bude a,b,a,b,a,b... tento blok je pre všetky a
>>             self.b=(self.a+self.b)
>>             self.default+=1
>>             if self.default>=self.pocet_cisiel:
>>                 print("\n")
>>                 break
>>             print(self.b,end=" ")
>>             # a tento pre všetky b
>> #################Hlavný program##########################
>> MojaInstancia=Fibonacci(pocet_cisiel=20)
>> MojaInstancia.proces()
>>
>>
>> ************************************************************************************************************
>> Tu je další:
>>
>> # -*- coding: utf-8 -*-
>> # program Záznamník adries
>> # tréning Tkinter + OOP
>> # autor JA, dnes
>> # ver. 1.0
>> # * opravená chyba pri vytvárani poľa pre zadávaní adresy, použitá
>> neexistujúca farba okna
>> # * opravená chyba pri vytváraní tlačítka ukončujúceho okno zadávania,
>> použitý neexistujúci názov prvku
>> # * zmenené umiestnenie a veľkosť tlačítka pre zavretie okna pri
>> pridávaní adries
>> # ver. 1.1
>> # * opravená chyba pri potvrdení voľby mena pri pridávaní mena, použitá
>> neexistujúca premenná
>> # * opravená chyba pri potvrdení voľby mena pri pridávaní adresy, použitá
>> neexistujúca premenná
>> # ver. 1.2
>> # * polia pre zadávaní mena aj adresy sa po zadaní oboch údajov teraz
>> vymažú (ich hodnota)m
>> #   uživatel ich teraz nemusí zadávať sám
>> # * opravená chyba pri  načítaní údajov zo zoznamu, použitá neexistujúca
>> premenná
>> # ver. 1.2.1
>> # * opravená chyba pri zobrazovaní načítaných údajov,použitá neexistujúca
>> premenná
>> # ver. 1.3
>> # * opravená chyba pri vytváraní tlačítka na zavretie okna načítania
>> údajov, použitá neexistujúca
>> #   premenná
>> # * opravená chyba pri zobrazovaní načítaných údajov (druhá chyba v
>> tomto), použitá neexistujúca premenná
>> # * zmenený text niektorých tlačítok v úvodnom menu
>> # * v popisku okna sa teraz zobrazuje aj aktuálna verzia programu
>> # ver. 1.3.1
>> # * pri načítaní údajov upravená oddelovacia čiara údajov
>> # * zmenené rozmery tlačítka ukončujúceho okno načítania údajov
>> # ver. 1.3.2
>> # * v okne ukladania súboru zmenená farba informačného textu na
>> prehľadnejšiu
>> # * opravená chyba pri ukladaní súborov, použitá neexistujúca premenná
>> # ver. 1.4
>> # * opravená chyba pri ukladaní súborov, použitá ďalšia neexistujúca
>> premenná
>> # * zmenená farba riadku pre chybové hlásenia v okne ukladania dát na
>> prirodzenú bledomodrú
>> # * pridaná možnosť odstránenia položiek zo zoznamu
>>
>>  from tkinter import *
>> import sys
>> import os
>>
>> class Zaznamnik:
>>     "Toto je trieda môjho záznamníku"
>>
>>     def __init__(self):
>>         self.hlavneOkno=Tk()
>>         self.hlavneOkno.title("Záznamník, Ver. 1.4")
>>         self.adresy=[]
>>         self.zoznamMena=[]
>>
>>     def program(self):
>>         "Táto časť programu bude mať za úlohu čisto len grafiku hlavného
>> menu (nie logiku)."
>>
>> self.HOuvodnypopisokLabel=Label(self.hlavneOkno,bg="lightblue",text="Vitajte
>> v mojom záznamníku adries.\nDúfam, že sa vám bude páčiť.")
>>         self.HOuvodnypopisokLabel.grid(row=0,column=0,sticky=W+E+N+S)
>>         # uvodny popisok - label - ktorý nás privíta v programe
>>
>> self.HOtlacitkoZadavatAdresy=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Pridať
>> adresy do záznamníka")
>>         self.HOtlacitkoZadavatAdresy.grid(row=1,column=0,sticky=W+E+N+S)
>>         # tlačítko, ktoré by malo umožniť zadávanie adries
>>
>> self.HOtlacitkoOdstranitAdresy=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Odstrániť
>> adresu zo záznamníka")
>>         self.HOtlacitkoOdstranitAdresy.grid(row=2,column=0,sticky=W+E+N+S)
>>         # tlačítko, ktoré by malo umožniť odstránenie adries
>>
>> self.HOtlacitkoUlozit=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Uložiť
>> do súboru")
>>         self.HOtlacitkoUlozit.grid(row=3,column=0,sticky=W+E+N+S)
>>         # tlačítko, ktoré by malo umožnit uloženie do súboru
>>
>> self.HOtlacitkoNacitat=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Načítať
>> dáta zo zoznamu")
>>         self.HOtlacitkoNacitat.grid(row=4,column=0,sticky=W+E+N+S)
>>         # tlačítko, ktoré by malo umožniť načítanie dát zo súboru
>>
>> self.HOtlacitkoNapoveda=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Zobrazenie
>> nápovedy")
>>         self.HOtlacitkoNapoveda.grid(row=5,column=0,sticky=W+E+N+S)
>>         # tlačítko, ktoré by malo zobraziť nápovedu
>>
>> self.HOtlacitkoUkoncit=Button(self.hlavneOkno,bg="lightblue",activebackground="lightgreen",text="Ukončiť
>> program",command=self.hlavneOkno.quit)
>>         self.HOtlacitkoUkoncit.grid(row=6,column=0,sticky=W+E+N+S)
>>         # tlačítko, ktoré by malo ukončiť program
>>
>>         def zadavanie_adries():
>>             "Táto časť bude zachytávať logiku programu. Kvoli velkému
>> rozsahu rozdelenú na niekoľko častí. Konkrétne zadávanie adries."
>>             # prvá časť tejto funkcie
>>             # vzhľad podokna na zadávanie
>>             self.OknoZadavanie=Toplevel()
>>             self.OknoZadavanie.title("Zadávanie adries")
>>
>> self.OknoZadavanieLabel=Label(self.OknoZadavanie,bg="lightblue",text="
>> Aktuálna činnosť: Zadávanie adries                 \nPre potvrdenie údaju z
>> okna stlačte ENTER.\n")
>>
>> self.OknoZadavanieLabel.grid(row=0,column=0,columnspan=4,sticky=W+E+N+S)
>>             # Vytvorenie podokna na zadávanie adries, nastavený titulok +
>> úvodný Label
>>             self.VarPPCH=StringVar()
>>
>> self.OknoZadavanieLabelChybHlasky=Label(self.OknoZadavanie,bg="lightblue",textvariable=self.VarPPCH)
>>
>> self.OknoZadavanieLabelChybHlasky.grid(row=1,column=0,columnspan=4,sticky=W+E+N+S)
>>             # Vytvorená textová premenná pre prípadné chybové hlášky. Pre
>> začiatok sa bude tváriť ako
>>             # neviditeľná súčasť okna
>>
>> self.RamecZadajMeno=Frame(self.OknoZadavanie,bd=3,bg="lightblue")
>>
>> self.RamecZadajMeno.grid(row=2,column=0,columnspan=4,sticky=W+E+N+S)
>>             self.VarPZM=StringVar()
>>             # Vytvorený rámec pre zadanie mena + popisok k nemu. Taktiež
>> premenná pre políčko
>>             # pre vstup
>>             self.RamecPopisokPola=Label(self.RamecZadajMeno,text="Zadajte
>> meno dotyčného:",bg="lightblue")
>>             self.RamecPopisokPola.grid(row=2,column=0,sticky=W+E+N+S)
>>
>> self.PolePreVstupMena=Entry(self.RamecZadajMeno,bg="lightyellow",textvariable=self.VarPZM,font="Arial
>> 8")
>>
>> self.PolePreVstupMena.grid(row=2,column=1,columnspan=3,sticky=W+E+N+S)
>>             # Vytvorený popisok pre pole pre vstup + políčko samotné
>>
>> self.RamecZadajAdresu=Frame(self.OknoZadavanie,bd=4,bg="lightblue")
>>
>> self.RamecZadajAdresu.grid(row=3,column=0,columnspan=4,sticky=W+E+N+S)
>>
>> self.LabelPreDruhePole=Label(self.RamecZadajAdresu,bg="lightblue",text="Zadajte
>> adresu dotyčného: ")
>>             self.LabelPreDruhePole.grid(row=3,column=0,sticky=W+E+N+S)
>>             self.VarPPA=StringVar()
>>
>> self.PolePreAdresu=Entry(self.RamecZadajAdresu,bg="lightyellow",textvariable=self.VarPPA,font="Arial
>> 8")
>>             self.PolePreAdresu.grid(row=3,column=1,columnspan=3)
>>             # Vytvorený rámec pre zadanie adresy, popis pre neho,
>> premennú pre neho a taktiež pole
>>             # samé.
>>
>> self.ZadavacieTlacitkoUkoncit=Button(self.OknoZadavanie,bg="lightblue",activebackground="lightgreen",command=self.OknoZadavanie.destroy,text="Zavrieť
>> toto okno")
>>
>> self.ZadavacieTlacitkoUkoncit.grid(row=4,column=0,columnspan=4,sticky=W+E+N+S)
>>             self.OverovaciToken=0
>>             # Vytvorené tlačítko pre zavretie tohto okna pre zadanie
>> adresy.
>>             def enter(BoloStlacene):
>>                 BoloStlacene.widget.configure(state=DISABLED)
>>                 self.udajMeno=str(self.PolePreVstupMena.get())
>>                 self.OverovaciToken+=1
>>                 if self.OverovaciToken==2:
>>                     self.PolePreVstupMena.configure(state=NORMAL)
>>                     self.PolePreAdresu.configure(state=NORMAL)
>>                     self.zoznamMena.append(self.udajMeno)
>>                     self.VarPZM.set("")
>>                     self.VarPPA.set("")
>>                     self.adresy.append([self.udajMeno,self.udajAdresu])
>>                     self.OverovaciToken=0
>>             # funkcia, čo sa má stať po zdarnom zadaní informácie do
>> políčka Meno. Dané políčko
>>             # sa disabluje, údaj z neho sa uloží. + špecialita overovací
>> token. Ak dosiahne hodnotu 2,
>>             # program zistí, že má spravit ďalšiu "obrátku" pri pridávaní
>> do zoznamu
>>             def entri(StlaceneBolo):
>>                 StlaceneBolo.widget.configure(state=DISABLED)
>>                 self.udajAdresu=str(self.PolePreAdresu.get())
>>                 self.OverovaciToken+=1
>>                 if self.OverovaciToken==2:
>>                     self.PolePreVstupMena.configure(state=NORMAL)
>>                     self.PolePreAdresu.configure(state=NORMAL)
>>                     self.zoznamMena.append(self.udajMeno)
>>                     self.VarPZM.set("")
>>                     self.VarPPA.set("")
>>                     self.adresy.append([self.udajMeno,self.udajAdresu])
>>                     self.OverovaciToken=0
>>             # táto funkcia zase slúži na definovanie činnosti políčka
>> Adresy. Zapíše údaj
>>             # do zoznamu a disabluje políčko. Malo by to zabezpečiť
>> zadávanie.
>>             self.PolePreVstupMena.bind("<Return>",enter)
>>             self.PolePreAdresu.bind("<Return>",entri)
>>             # čo sa má stať po stlačení Entrov v rôznych okienkach
>>
>>         def nacitanie_dat():
>>             "Táto funkcia by mala zabezpečiť zobrazenie, resp. načítanie
>> dát zo zoznamu."
>>             self.OknoNacitanie=Toplevel()
>>             self.OknoNacitanie.title("Načítanie dát")
>>             # vytvorené vlastné okno pre načítanie dát, kde by sa
>> teoreticky mali zobrazovať
>>             # dáta uložené v zozname adries
>>
>> self.oknoNacitanieZobrazenie=Label(self.OknoNacitanie,bg="lightblue",text="")
>>             self.oknoNacitanieZobrazenie.grid(row=0,column=0)
>>
>> self.premenna="""\tMená\t\tAdresy\n***************************************\n"""
>>             if len(self.adresy)==0:
>>                 self.oknoNacitanieZobrazenie.configure(text="Zoznam je
>> prázdny.")
>>             else:
>>                 for p in self.adresy:
>>                     self.coNacitaj="\t{0}\t\t{1}\n".format(p[0],p[1])
>>                     self.premenna+=self.coNacitaj
>>                 self.oknoNacitanieZobrazenie.configure(text=self.premenna)
>>             # toto by malo zabezpečiť zdarné zobrazovanie položiek zoznamu
>>
>>
>> self.tlacitkoUkoncitON=Button(self.OknoNacitanie,bg="lightblue",activebackground="lightgreen",text="Zavrieť
>> toto okno",command=self.OknoNacitanie.destroy)
>>             self.tlacitkoUkoncitON.grid(row=1,column=0,sticky=N+S+E+W)
>>             # toto tvorí tlačítko, ktoré by mohlo zavrieť okno
>>
>>         def ulozenie_do_suboru():
>>             "Toto má na starosti zdarné uloženie dát do súboru. Trošku
>> nám pomôže predošlá funkcia, načítanie dát."
>>             self.OknoUlozenie=Toplevel()
>>             self.OknoUlozenie.title("Uloženie do súboru")
>>
>> self.OknoUlozenieLabelVyber=Label(self.OknoUlozenie,text="Vyberte meno
>> súboru, do ktorého chcete uložiť dáta zo súboru.",bg="lightblue")
>>
>> self.OknoUlozenieLabelVyber.grid(row=0,column=0,columnspan=2,sticky=W+E+N+S)
>>             # vytvorené ukladacie okno, nastavený popisok pre neho +
>> popisok pre políčko pre zadanie mena ukladacieho súboru
>>             self.OUPPV=StringVar()
>>
>> self.OUPolePreVstup=Entry(self.OknoUlozenie,bg="lightyellow",font="Arial
>> 8",textvariable=self.OUPPV)
>>
>> self.OUPolePreVstup.grid(row=0,column=2,columnspan=2,sticky=W+E+N+S)
>>             # pole, kam môžeme zadávať samotný názov súboru
>>
>> self.OUPosudzovaciaHlaska=Label(self.OknoUlozenie,bg="lightblue",text="")
>>
>> self.OUPosudzovaciaHlaska.grid(row=1,column=0,columnspan=4,sticky=W+E+N+S)
>>             # tu sa vypíš prípadná chybová hláška, v závislosti od toho,
>> čo zadáme do zmieneného políčka
>>             def entricek(ppv):
>>                 self.result=str(self.OUPolePreVstup.get())
>>                 if len(self.result)==0:
>>                     self.OUPosudzovaciaHlaska.configure(text="Nezadali
>> ste meno žiadneho súboru.")
>>                     self.OUPPV.set("")
>>                     return
>>                 # ak ste nezadali nič, tak vypíše hlášku, znuluje hodnotu
>> pola a zavrie funkciu
>>                 if len(self.adresy)==0:
>>                     self.OUPosudzovaciaHlaska.configure(text="Zoznam
>> adries je prázdny.")
>>                     self.OUPPV.set("")
>>                     return
>>                 # podobné ako v predchádzajúcom prípade, ibaže ak je
>> zoznam adries prázdny
>>                 self.subor=open(self.result,"wt")
>>                 try:
>>                     self.subor.write(self.premenna)
>>                 except:
>>                     self.OUPosudzovaciaHlaska.configure(text="Zatial ste
>> nenačítali žiadne dáta. Urobte tak cez hlavné menu.")
>>                     self.subor.close()
>>                     self.OUPPV.set("")
>>                     return
>>                     # stale je možnost že uživatel nenačítal požadované
>> dáta na vloženie
>>                 self.OUPosudzovaciaHlaska.configure(text="Zatial ste
>> nenačítali žiadne dáta. Urobte tak cez hlavné menu.")
>>                 self.subor.close()
>>                 self.OUPolePreVstup.configure(state=DISABLED)
>>                 # toto sa stane v pripade že chyba nenastala,
>>             self.OknoUlozenie.bind("<Return>",entricek)
>>
>> self.OUTlacitkoZavri=Button(self.OknoUlozenie,bg="lightblue",activebackground="lightgreen",text="Zavrieť
>> toto okno",command=self.OknoUlozenie.destroy)
>>
>> self.OUTlacitkoZavri.grid(row=2,column=0,columnspan=4,sticky=W+E+N+S)
>>             # urobené tlačítko, ktoré zavrie okno
>>
>>         def odstranenie_poloziek():
>>             "Odstránenie jedného záznamu zo zoznamu adries a mien"
>>             self.OknoOdstranenie=Toplevel()
>>             self.OknoOdstranenie.title("Odstranenie poloziek")
>>             self.OOpripravenytext=[]
>>             # vytvorené okno odstránenia, nastavený popisok + náradíčko =
>> prázdny zoznam
>>             for x in self.zoznamMena:
>>                 self.OOpripravenytext.append(x)
>>
>> self.OOodstranenieLabel=Label(self.OknoOdstranenie,bg="lightblue",text="Vyberte
>> si položku zoznamu,ktorú\nchcete odstrániť:")
>>             self.OOodstranenieLabel.grid(row=0,column=0)
>>             # pripraví zoznam položiek pre neskoršie odstranovanie +
>> vytvorenie labelu na odstranenie
>>             # položky
>>             self.OOPPO=StringVar()
>>
>> self.OOPolePreOdstranenie=Entry(self.OknoOdstranenie,bg="lightyellow",textvariable=self.OOPPO,font="Arial
>> 8")
>>
>> self.OOPolePreOdstranenie.grid(row=0,column=1,columnspan=2,sticky=W+E+S+N)
>>
>> self.OOLabelChybovaHlaska=Label(self.OknoOdstranenie,bg="lightblue",text="")
>>
>> self.OOLabelChybovaHlaska.grid(row=1,column=0,columnspan=3,sticky=W+E+S+N)
>>             # samotné políčko, kam možete zadat meno položky (meno
>> konk.osoby, ktorú chcete odstrániť
>>             def stlacil_entri(gangnam):
>>                 coBoloStlacenee=str(self.OOPolePreOdstranenie.get())
>>                 if coBoloStlacenee in self.zoznamMena:
>>
>> indexCoBoloStlacenee=self.zoznamMena.index(coBoloStlacenee)
>>                 else:
>>
>> self.OOLabelChybovaHlaska.configure(text="Neexistujúce meno.")
>>                     self.OOPPO.set("")
>>                 del self.adresy[indexCoBoloStlacenee]
>>                 del
>> self.zoznamMena[self.zoznamMena.index(coBoloStlacenee)]
>>                 self.OOPPO.set("")
>>                 # zoberieme to z políčka pre vstup, ak je v zozname mien,
>> odstrán z oboch zoznamov
>>                 # ak nie, vyhod chybove hlasky. Samozrejmostou je
>> nasledne premazanie policka
>>             self.OOPolePreOdstranenie.bind("<Return>",stlacil_entri)
>>
>> self.OOZavriOkno=Button(self.OknoOdstranenie,bg="lightblue",activebackground="lightgreen",text="Zavrieť
>> toto okno",command=self.OknoOdstranenie.destroy)
>>
>> self.OOZavriOkno.grid(row=2,column=0,columnspan=3,sticky=W+E+S+N)
>>             # zabezpečená akcia pre pole pre vstup po stlačení Enteru.
>>             # vytvorené tlačítko na zavretie okna
>>
>>
>>         self.HOtlacitkoNacitat.configure(command=nacitanie_dat)
>>         self.HOtlacitkoUlozit.configure(command=ulozenie_do_suboru)
>>         self.HOtlacitkoZadavatAdresy.configure(command=zadavanie_adries)
>>
>> self.HOtlacitkoOdstranitAdresy.configure(command=odstranenie_poloziek)
>>
>>         self.hlavneOkno.mainloop()
>>
>> #########################################################
>>
>> inst=Zaznamnik()
>> inst.program()
>>
>> Ďakujem za akúkolvek odpoved
>>
>> _______________________________________________
>> Python mailing list
>> Python na py.cz
>> http://www.py.cz/mailman/listinfo/python
>>
>
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20130112/44fe853f/attachment.html>


Další informace o konferenci Python