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