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

David Rohleder davro na ics.muni.cz
Sobota Leden 12 22:47:03 CET 2013


Zdá se mně to, nebo používáš v každé úrovni jiné odsazení?


Roman Beno píše v So 12. 01. 2013 v 18:08 +0100:
> 
> 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




Další informace o konferenci Python