[python] Statické metody v Pythonu
superman
feed na centrum.cz
Středa Listopad 8 13:48:56 CET 2006
>>>class uhel:
>>> @staticmethod
>>> def static_str_na_radiany(s):
>>> return blablabla;
>>>[...]
>>>class zemepisny_uhel(uhel):
>>> def static_str_na_radiany(s):
>>> return blablabla;
>>>[...]
>>
>>Nikdy jsem to nepoužil a nechce se mi to zkoušet.
>>Bude ta metoda v potomkovi automaticky taky
>>statická?
>
>
> Nebude, že? Není tam self, takže by Python řval.
Teď jsem to otestoval. Nejenže nebude statická, ale začnou se dít i jiné
chyby. Protože v předkovi uhel se počítá s tím, že v metodě __add__ se
přes self předává jen jeden argument, najednou si v potomku začne
stěžovat na dva. Python má v tomhle asi nepořádek a asi nesnáší takové
šťoury jako jsem já. Takže závěr nikdy nezkoušejte předefinovat
statickou metodu nestatickou, protože Python si s tím neví rady a začne
hlásit chyby i tam, kde by to v jiných jazycích bylo v pořádku. Never is
perfect :-)))
class uhel:
@staticmethod
def static(a):
print "trida1.static(): ", a
def method(self):
self.static(1)
class zemepisny_uhel(uhel):
#@staticmethod
def static(a):
print "trida2.static(): ", a
a = uhel()
a.method()
b = zemepisny_uhel()
b.method()
trida1.static(): 1
Traceback (most recent call last):
File "C:\home\astrol\test.py", line 25, in ?
b.method()
File "C:\home\astrol\test.py", line 10, in method
self.static(1)
TypeError: static() takes exactly 1 argument (2 given)
Závěr: Python se chová tak, jako kdyby definici třídy znovu překládal do
definice potomka. Zápis self.static přeloží v uhel.method jako volání
statické metody s jedním parametrem, zatímco v zemepisny_uhel jako
volání normální metody se dvěma parametry. Řekl bych, že tato feature je
dost error prone, a že vlastnost "zapouzdření" dostává pěkně na zadek.
Miloslav Ponkrác
Další informace o konferenci Python