[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