[python] Statické metody v Pythonu
superman
feed na centrum.cz
Středa Listopad 8 13:22:22 CET 2006
> Tvrdis to sice dost sebavedome, ale ja tomu nerozumiem, preco musi byt ta
> metoda v triede uhel prave staticka a preco nemoze byt dynamicka, ked ju v
> objekte zemepisny_uhel prekryvas? Coby sa stalo, keby bola dynamicka?
> Naco je ta metoda staticka to je spolocna pre vsetky instancie triedy, ked
> ju ides potom prekryvat?
Nestane se vůbec nic, když ta metoda bude dynamická, jenom prostě
dostane jeden parametr navíc, tedy self, který se k ničemu nepoužije a
zahodí se.
> Cely tvoj priklad nefunguje a volanie self.static_str_na_radiany mi
> vyhadzuje chybu
> static_str_na_radiany() takes exactly 1 argument (2 given)
Pokud to volám uvnitř třídy se self, tak to funguje. Python pochopí, že
namísto self chci vlastně použít jméno třídy. Když nad tím tak
přemýšlím, jestli je to vůbec korektní, jestli by se nemělo spíš použít
něco ve stylu self.__name__.metoda (samozřejmě tento zápis je blbost,
ale já to neovládám, takže to berte spíš jako "vyjádření algoritmu").
Mimo třídu už to Python nepochopí a snaží se self předat jako argument.
Představuji si to tak, že při definici třídy Python projde metody a
získá informaci, že statická metoda nechce parametr self a tak volání
self.metoda převede na trida.metoda. Mimo definici třídy se Python chová
dost hloupě a prostě chce otrocky self předávat jako parametr aniž by
tušil, že to je blbost. Takhle můžou vzniknout i dost ošklivé chyby ve
stylu:
class t:
@staticmethod
def secti_tri_inty(a = 0, b = 0 ,c = 0):
return a * b * c;
instance = t()
instance.secti_tri_inty(1,2)
Tohle asi udělá něco jiného, než bylo zamýšleno a to se hodně špatně hledá.
Osobně bych si přál, aby Python byl opraven, aby i statické metody
fungovaly správně mimo definici třídy. Ve všech jazycích to tak funguje.
> Pouzitie statickej metody (t.j. metody triedy) by som videl v tom keby
> pracovala so statickymi premennymi (t.j. premennymi triedy), to je takymi
> premennymi, ktore su pre vsetky instancie danej triedy spolocne.
> Ale z tvojho vykladu to nevidim. Skus to prosim nejako vysvetlit, aj s
> funkcnym kodom.
Statická metoda je prostě metoda, která jen nezná instanci třídy! Nic
víc a nic méně. Zbylé použití už nechte na fantazii programátora a
neomezujte ho (teď jsem trochu moc drzý, promiňte mi mou smělost) :-))).
Pokud prostě je potřeba polymorfismus, u kterého není potřeba znát
instanci třídy, je to přesně případ pro statickou metodu. Jestli
statická metoda bude pracovat nad globálními, nebo statickými
proměnnými, případně nad žádnými proměnnými je už jedno. Druhé možné
použití je, pokud nepotřebuji pracovat s instančními proměnnými a chci z
nějakého důvodu mít metodu v prostoru jmen třídy.
Případ funkčnho kódu poslat mohu, prostě se mi jedná o třídu pracující s
úhlem, která definuje matematické operace nad úhlem i další základní
operace plus konverze úhlu do a ze stringu, čísla a objektu. Nad tím mám
potomky pracující se zeměpisnou šířkou a délkou a s astronomickými úhly.
Zatím je to under construction. :-)))
Miloslav Ponkrác
>
Další informace o konferenci Python