[python] Statické metody v Pythonu

superman feed na centrum.cz
Středa Listopad 8 12:11:18 CET 2006


> Stejně je ale otázka, jestli opravdu chci používat
> statické metody třídy. V podstatě jsou elegantní jen
> v případě, kdy používají proměnné stejné třídy. 
> A zavádění proměnných třídy v Pythonu asi taky 
> není moc časté.

> Odhaduji, že požadavek na použití statické metody
> třídy může být zlozvyk z Javy, kde to jinak nejde.
> V jazycích, které to umožňují, je lepší zavést
> pro zvláštní skupinu funkcí oddělený prostor jmen.
> V Pythonu se to dělá založením souboru-modulu.
> Zápis pak vypadá úplně stejně. 

Ne, tohle je zlozvyk z dynamicky typovaných jazyků, alespoň ten účel, 
kde to chci použít. O Javě raději ani nemluvím, to je jazyk, který si na 
objektové programování jenom hraje a kde se musíte neustále drbat levou 
rukou za pravým uchem a obcházet nedokonalosti a nedomyšlenosti toho jazyka.

Uvědomte si, že statická metoda patří do prostoru jmen třídy a její 
potomek jí může předefinovat. Jediným rozdílem je, že statická metoda 
nezná konkrétní instanci třídy. Takže klidně můžete udělat toto:

def uhel:
   @staticmethod
   def static_str_na_radiany(s):
     # tato metoda umi konvertovat matematicky
     # uhel zapsany ve stringu na radiany
     return blablabla;

   def __add__(self, other):
     if isinstance(other, basestring):
       return uhel(self.__radians + self.static_str_na_radiany(other));
     elseif:
       # a tak dale

def zemepisny_uhel(uhel):
   def static_str_na_radiany(s):
     # tato metoda umi konvertovat zemepisny
     # uhel zapsany ve stringu na radiany
     # na rozdil od stejne metody v predkovi
     # umi konvertovat i GPS souradnice
     return blablabla;

zem_uhel = zemepisny_uhel(30.0)
zem_uhel = zem_uhel + "30N54"

Tohle je velmi blízké tomu co chci udělat a díky statické metodě vím, že 
metoda __add__ ve třídě uhel bude naprosto správně fungovat i pro 
potomky, tedy pro třídu zemepisny_uhel i jakékoli další. Stačí 
předefinovat prostě jen statickou metodu na konverzi stringu v potomkovi 
a všechny metody ve třídě uhel budou pracovat naprosto správně a není 
třeba přepisovat řadu dalších metod.

Pokud znáte lepší řešení, než s použitím statických metod, sem s ním.

Miloslav Ponkrác




Další informace o konferenci Python