[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