Portál AbcLinuxu, 1. května 2025 12:50

Nástroje: Začni sledovat (3) ?Zašle upozornění na váš email při vložení nového komentáře.

Vložit další komentář
1.5.2009 00:07 Honza Kral
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Odpovědět | Sbalit | Link | Blokovat | Admin

stringy jsou immutable, kazdym prirazenim vytvaris novou instanci, zatimco list je objekt, kde jen modifikujes vnitrni stav

1.5.2009 00:10 Honza Král | skóre: 3 | Praha
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

jinak ani u foo by nefungovalo

self.foo = ['novy', 'list']

kdyz prirazujes na objekt, priradi se to na objekt, a prekryje to tedy ten atribut na tride.

Milan Lajtoš avatar 1.5.2009 00:49 Milan Lajtoš | skóre: 22 | blog: /blog/babraq
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Uuuf, ďakujem. Na mutable/immutable som vôbec nepomyslel.

Ale statické foo by sa dalo vytiahnuť cez class1.foo, aj keď by bolo prekryté atribútom na objekte. Eh, pristupovanie k statickým premenným cez inštanciu by sa malo zakázať! ;)
“Every great achievement was once considered impossible.”
1.5.2009 09:54 CEST
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
stringy jsou immutable, ..., zatimco list je objekt,
A pak me presvedcujte o tom, ze Python (a dalsi podobne jazyky ala Java, C++, vcetne meho oblibeneho Perlu) jsou objektove orientovane jazyky. Smalltalk na vas.

Pricemz me opravdu vytaci, kdyz vidim u lakadla na jazyk Python neco ve smyslu "objektově-orientovaný programovací jazyk" (viz. www.py.cz), a pak to nadherne popiraji pouzivanim prikazu (if, for, while...) nebo pouzivanim prasaren jako
re.search("c", "abcdef")
Z toho se zacatecnik akorat nauci, ze ma delat vlastni tridu, kterou bude jenom zastresovat nejaky vetsi akce, pak vytvori jenom jeden objekt tehle tridy a tam bude volat tyhle svoje metody vzdy s parametrama, misto aby vytvoril vlastni tridu, kterou vytvori rozsirenim nejaky originalni tridy a do ty pak prida vlastni metody a ty bude pak volat na ten konkretni objekt, napr. ten regular vyse by mel byt spravne
"abcdef".search("c")
Proste na objektu typu (ze tridy) string by mela byt metoda search s jednim parametrem udavajicim regexp, kterej se ma hledat v tom objektu string. Ono sice jde pomoci compile vytvorit objekt RegExp a na ten pak volat match jenom s parametrem stringu, ale bohuzel umoznuje i tu prvni prasarnu, takze se to tak zacatecnici nauci, protoze to odpovida klasickymu programovani (IMHO klasicky programovani je trosku pochopitelnejsi nez OOP).

proste v tomhle me Python znechucuje a pak jeste oddelovani prikazu odsazovanim - perl, awk, sed pouzivam v cmdline. Python mi tohle nedovoli (nebo jo?), takze s nim nemuzu zacit ani na jednoduchych vecech.
Limoto avatar 1.5.2009 10:43 Limoto | skóre: 32 | blog: Limotův blog
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

>>> "string".find('t')
1

 

Ale s regexpama už to takhle nepůjde...

1.5.2009 11:01 jan
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

Perl je multiparadigmický jazyk, ne pouze oběktový. Díky tomu je implementace oběktů, bloků atd.. jako ve smalltalku triviální, zkuste si ale ve smalltalku implementovat perl ;-)

Implementovat regexp jako obekt (a ne metodu stringu) ma take svoje vyhody - sestrojeni automatu z regexpu neni zadarmo a je dost pravdepodobne, ze jeden vyraz pouzijete vickrat nez jen jednou.

1.5.2009 11:40 CEST
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Perl mam rad a pouzivam ho, dokonce ho ted zacinam pouzivat misto grepu a sedu, pokud to je jednodussi, tak i awku. Objekty v perlu znam a libi se mi, ale nikdo se nesnazi presvedcovat, ze perl je skvele objektovej jazyk, zatimco u pythonu to tlaci, jak je python skvele objektovej, ze se na tom zacatecnici nauci objektove programovat. A to me stve, protoze python proste neni dobre objektovej a zaroven se michaji prikazy, funkce a metody. Smalltalk jsem uvedl, protoze jsem ho na vysokej mel a na nem je videt, co je skutecny OO jazyk.

Nejsem proti tomu, vytvorit ze stringu (zapis regexpu) objekt a na nej pak aplikovat hledani ve stringu. Jde mi o to, ze python umoznuje prasarny typu
string.match(RETEZEC,REGEXP)
protoze podle me by to melo byt spravne bud
RETEZEC.match(REGEXP)
nebo v pripade pouziti stejnyho regularu vickrat
REGEXPO.match(RETEZEC)
Proste metody, ktery pracujou s konkretnim objektem, volat primo na objekt. Ne volat metodu na tridu a nacpat ji parametry, se kteryma ma pracovat - jasne, existujou tridni metody a promenne, ktere by ale mely pracovat spis jako globalne se tridou a ne s jednotlivyma instancema. Potom si zacatecnik mysli, ze objektovy programovani je jenom o tom vytvorit tridu, do ni da vlastni funkce a pak tyhle funkce volat pres tu tridu. Proste nepochopeni OOP.
1.5.2009 14:13 Ondrej 'SanTiago' Zajicek
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

Myslim, ze tohle je zrovna typicka ukazka nepochopeni OOP. Z hlediska OOP je uplne jedno jaky je kolem toho syntakticky cukr, zda se to vola jako match(RETEZEC,REGEXP), RETEZEC.match(REGEXP) nebo REGEXPO.match(RETEZEC). Dulezite je, kde je pozdni vazba a jak se dela dispatch podle typu. Napriklad v takovem CLOS by se to psalo match(RETEZEC, REGEXP) (nebo presneji receno (match RETEZEC REGEXP) ) a pritom je pozdni vazba a moznosti pretizeni a polymorfismu v obou argumentech.

Krom toho chapat funkci match jako metodu objektu string je IMHO dost zcestne. Ta funkce nepotrebuje zadnou interni znalost stringu krom nejakeho jeho obecneho rozhrani a nema k nemu nijak blizsi vztah nez k druhemu argumentu. V takovem pripade (kdy druhy argument je take string a ne specielni objekt typu REGEXP) je IMHO vhodnejsi pohlizet na ni jako na nezavislou funkci.

Python neznam, ale tipuji, 'string.match' je spis namespace issue, nez ze by to melo nejakou souvislost s OOP.

1.5.2009 16:34 joe
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
"tohle je zrovna typicka ukazka nepochopeni OOP"

Presne tak, nepochopil jste podstatu spojeni "objektove orientovany".
3.5.2009 12:55 l4m4
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Zjevně pochopil.

Ostatně re.match(x,y) modulu re zašle zprávu match(x,y). Je to formálně úplně stejně OO jako zaslání zprávy match(y) řetězci x -- a úplně stejně z hlediska OO nedává velký smysl věcně. Nejde chtít jedno a odmítat druhé.
1.5.2009 17:10 Martin Mareš
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Proste metody, ktery pracujou s konkretnim objektem, volat primo na objekt.
A se kterým konkrétním objektem tato metoda pracuje? :-) Já tam vidím konkrétní objekty dva a nedává mi smysl kterýkoliv z nich preferovat. Vaše "OO" je v tomto případě jen nepříliš logické syntaktické pozlátko (jak poznamenal již Santiago, objektovost spočívá v něčem poněkud jiném).
1.5.2009 14:34 JS
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

 A neni to jedno? Ja treba tenhle Smalltalkovsky fundamentalismus (tj. misto len(a) musi byt a.len()) moc nechapu. Na druhou stranu, chapu Lispovy fundamentalismus - tam to ma aspon duvod (makra a genericke funkce).

1.5.2009 17:28 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
misto len(a) musi byt a.len()
tak toto povazuju za jednu z nejvetsich demenci v pythonu... (a ze by se jich jeste par naslo) ;-]

knihovny jsou napsane tak, ze nejde urcit jestli danou funkcionalitu nabizi ,,funkce'' nebo ,,metoda'' a pokud v tom clovek nedela dnes a denne tak to musi resit pokus omyl nebo dohledavani v dokumentaci.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
1.5.2009 17:59 JS
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

Hm, ja tedy ne, len(a) proste povazuji za syntakticky cukr pro volani a.__len__(), stejne jako treba a+b je syntakticky cukr pro a.__plus__(b). Nepripada mi na tom nic prilis kontroverzniho, proste len je jen jakysi dalsi operator.

Obecne nemam rad OO fundamentalisty; trochu mi pripadaji jako lide, kteri vynalezli novy zapis a domnivaji se, ze tim spasi programatorsky svet.

A naprosto souhlasim s Ondrejovym prispevkem.

1.5.2009 18:13 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
ja nejsem zadny OOP fundamentalista. me jenom vadi, ze v pripade pythonu je v tom hrozny (s prominutim) bordel. a treba v pripade toho len() me prijde logictejsi to dat jako metodu objektu, protoze se pracuje pouze s jeho vlastnostmi a nic jineho neni potreba.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
1.5.2009 18:30 JS
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

Jen pro poradek - nikdy jsem si nemyslel, ze jste OOP fundamentalista, to byla obecna poznamka. V tomto se ovsem neshodneme - me fakt, ze knihovny Pythonu nejsou vzdy plne objektove (nebo plne neobjektove) prilis nevadi (stejne musim koukat do manualu, jak se veci jmenuji a jake maji parametry, tak uz je to pak jedno).

1.5.2009 23:33 Michal
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

U Smalltalku v tomto případě nejde o žádný fungamentalismus, je to otázka syntaxe. Ve Smalltalku se objektům posílají zprávy, žádné len(a) tedy nelze napsat (tj. klasické volání funkce), jen a len, tj. objektu a posílám zprávu len.

3.5.2009 12:36 l4m4
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
To je syntaktický detail. Neexistuje důvod, proč by se poslání zprávy len objektu a nemohlo zapsat len(a). V Pythonu je len(x) syntaktická zkratka pro x.__len__(). Protestovat proti tomu lze z hlediska zanášení jmenného prostoru, ale ne proto, že by to nebylo OO.
1.5.2009 17:59 Kvakor
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Pricemz me opravdu vytaci, kdyz vidim u lakadla na jazyk Python neco ve smyslu "objektově-orientovaný programovací jazyk" (viz. www.py.cz), a pak to nadherne popiraji pouzivanim prikazu (if, for, while...)
Z toho jsem volaký zmetený. Jak se tedy mají v objektovém nefunkcionálním jazyce realizovat řídíci struktury když ne pomocí if, for a while ?
1.5.2009 18:15 razor | skóre: 33
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

Např jako poslání zprávy if, for, while ... objektu Boolean. http://www.friendofthepigeon.co.uk/wordpress/?page_id=45

 

2.5.2009 09:57 Kvakor
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Ve Smalltalku je všechno poslání zprávy, ale i v něm vypadá if i tak dost "ifózně":
'podmínka'
 ifTrue:[ 'kód vykonaný pokud splněno' ]
 ifFalse:[ 'kód vykonaný pokud nesplněno' ]
2.5.2009 11:26 razor | skóre: 33
Rozbalit Rozbalit vše Re: Statické premenné v Pythone

Všechno ne. Např. příkaz "return" :)

3.5.2009 12:46 l4m4
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
V tom případě není dost OO :o)

I mnohem úchylnější řídící konstrukce lze realizovat zasíláním zpráv objektu runtime prostředí (codestack, mašina, interpret, ...). Bude to úplně OO a Smalltalkisty přivede k orgasmu, ale to bude asi tak jediné praktické využití zapisování řídících konstrukcí tímto způsobem.
1.5.2009 20:26 pozortucnak | skóre: 21 | blog: vecny_windowsar
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
C...gobject...gtk
Jsem mimořádně obtížný případ
3.5.2009 14:01 pozortucnak | skóre: 21 | blog: vecny_windowsar
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
Jsem mimořádně obtížný případ
3.5.2009 17:05 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Statické premenné v Pythone
A pak me presvedcujte o tom, ze Python (a dalsi podobne jazyky ala Java, C++, vcetne meho oblibeneho Perlu) jsou objektove orientovane jazyky. Smalltalk na vas.
No ta odpověď byla zavádějící, protože v Pythonu jsou řetězce i seznamy objekty (jako prakticky všechno, co tam je). Rozdílem je, že změna immutable objektu vytvoří jeho novou instanci, kdežto změna seznamu ne.
pouzivanim prasaren jako
re.search("c", "abcdef")
Z toho se zacatecnik akorat nauci, ze ma delat vlastni tridu, kterou bude jenom zastresovat nejaky vetsi akce, pak vytvori jenom jeden objekt tehle tridy a tam bude volat tyhle svoje metody vzdy s parametrama, misto aby vytvoril vlastni tridu, kterou vytvori rozsirenim nejaky originalni tridy a do ty pak prida vlastni metody a ty bude pak volat na ten konkretni objekt, napr. ten regular vyse by mel byt spravne
"abcdef".search("c")
Není hezké kritizovat Python, pokud o něm nic nevím ;-). To re není instance třídy, nýbrž modul, který poskytuje funkci search. Ten modul dokonce poskytuje funkce pro vytvoření pattern objektu, takže se dá napsat i tento kód
pat = re.compile("c")
pat.search("abcdef")
Potom je pochopitelně otázka, zda nemá každá instance třídy string poskytovat i podporu pro regulární výrazy, ale Python obecně inklinuje k malým třídám a implementaci pomocí skládání, nikoli dědičnosti, takže v něm neexistují košaté rodiny různých tříd jako to má Smalltalk, Java, nebo Ruby.
When your hammer is C++, everything begins to look like a thumb.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.