[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