[python] Statické metody v Pythonu

superman feed na centrum.cz
Čtvrtek Listopad 9 10:45:26 CET 2006


> Ano. Ale toto je otázka návrhu. Typicky se definuje operátor
> pro sčítání (operator+() nebo __add__()), který pracuje s
> argumentem stejné třídy, jako je sám objekt. V budoucnu si můžu
> vymyslet další konverze, ze kterých vypadne úhel. Z hlediska
> údržby je lepší, když se speciality dělají zvenku. Je tedy
> lepší venku převést string zeměpisné šířky na úhel a
> dosadit.

A proč tedy můžu v Pytonu psát:

unicode_string + ansi_8_bit_string

Proč v rámci tohoto pravdidla Python striktně netrvá na:

unicode_string + uniocde(ansi_8_bit_string)

Ono toto pravidlo, kdyby se mělo striktně dodržovat, pak bude každý 
programovací jazyk včetně Pythonu ukecaný jako COBOL, nebo Ada.

> Jedna věc je strojová efektivita a druhá věc je jak je to
> mentálně uchopitelné, tj. kolik to dá práce mozku
> programátora (pokud tedy neprogramuje srdcem ;)
> 
> The Zen of Python k tomu všemu může říci (výběr):
> 
> Explicit is better than implicit.
> Simple is better than complex.

A já bych dodal:

Too much explicit is worse than little implicit.
Too much simple is equal complex (basic rule of Zen: too much jin is jang)

 > Readability counts.
 > Special cases aren't special enough to break the rules.
 > In the face of ambiguity, refuse the temptation to guess.
 > If the implementation is hard to explain, it's a bad idea.
 > If the implementation is easy to explain, it may be a good idea.

Pod to se podepisuji.

> Obvykle se taky projevuje dualita mezi daty a kódem:
> Složitější kód, jednodušší datové struktury a naopak.
> Složitější kód může vést k úspoře paměti, ale obvykle také
> ke zvýšení časové náročnosti. Složitější datové struktury...

To je pravda.

> Asi bych raději místo statické metody použil obyčejnou
> funkci ve stejném modulu. Pokud by potomek potřeboval něco
> jiného, předefinoval by si příslušnou metodu tak, aby volala
> jinou funkci. Zadarmo bych tím také získal přístup k oné
> funkci bez závislosti na používání tříd, které ji používají
> (tj. např převod z řetězce na radiány).

Jenže ta funkce prostě nemá smysl bez třídy. Protože každá třída, tedy 
každý typ úhlu bere prostě string v jiných formátech. Jasně, že by to 
bylo možné vyřešit tak, že by byla řada funkcí na každou formát jeden, 
případně jedna funkce se dvěma parametry: string a číslo formátu. Ale 
myslím si, že třídní metoda tu prostě sedne. Když bvude statická, mám 
právě funkci pro převod bez závislosti na třídě, protože třída je tu jen 
a pouze prostor jmen a funkci jde zavolat i bez jakékoli instance.

Já jsem taky původně váhal, jestli namísto třídy Angle neudělat prostě 
pár normálních funkcí a třídou se vůbec nezatěžovat. Na jednodušší věci 
by to možná bylo lepší, prostě by zbytečně nevznikaly instance, všechno 
by byl float. Ale nakonec jsem se rozhodl pro komplexní řešení včetně 
operátorů, property a dalších.

> Ony dekorátory taky nic moc nedělají. Je to jen takový
> "syntactic sugar" -- to tvrdí "opravdoví programátoři"
> opovržlivě. Na druhou stranu, právě takové věci dělají
> použití jazyka elegantním. Přetěžování operátorů je taky
> syntaktický cukřík, ale jak pěkně se s tím pak pracuje!
> (Tedy pokud se to nachystá správně.)

No on ten syntaktický cukr je přesně to, co mají vyšší jazyky dělat. V 
opačném případě bychom mohli zůstat u strojáku. Já naprosto nesnáším 
přístup Javy, která zůstala někde mezi strojákem a vyšším jazykem a 
odmítá cokoli, co by mohlo zpřehlednit zdrojáky, protože se to dá opsat 
jinak. Pravdou je, že ze svého pravdila v Javě 5 slevila, neboť v tváří 
tvář .NET technologii už to začalo být neudržitelné i pro ten marketink 
kolem Javy.

Ale Python miluju právě pro ty syntatické cukry! Podpora seznamů, 
slovníků a dalších na úrovni jazyka, to je skvělá věc. V C++, Javě, a 
dalších je to jen knihovna, která dře. Skvělá podpora operátorů, o které 
se Javě ani nesní. A to nemluvím o generátorech, atd.. A různé ty map, 
filter a podobné (což prý v další verzi Pythonu nebude, ach jo). Python 
je jazyk, který mi vyhovuje, pokud mě tedy nedorazí nějakými chybami, 
což dělá poněkud častěji, než v jiných jazycích.




Další informace o konferenci Python