[python] Statické metody v Pythonu

Roman Miklos RMiklos na pss.sk
Středa Listopad 8 14:33:37 CET 2006


No ano, mne sa zda ze je logicke, ze staticku metodu nemozno predefinovat 
dynamickou, lebo dynamicka je svojou povahou ina. 
Poznas iny jazyk v ktorom to ide?

Ale skusal som toto, to je odkomentoval som to co ty si zakomentoval
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+5

a = uhel()
a.method()

b = zemepisny_uhel()
b.method()
c = uhel()
c.method()

a z toho dostanem toto

trida1.static():  1
trida2.static():  6
trida1.static():  1

to je, ze ani staticku metodu rodicovskej triedy nemozno predefinovat 
statickou metodou z potomka 




superman <feed na centrum.cz> 
Sent by: python-bounces na py.cz
08.11.2006 13:48
Please respond to
Konference PyCZ <python na py.cz>


To
Konference PyCZ <python na py.cz>
cc

Subject
Re: [python] Statické metody v Pythonu






>>>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



_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python


Mgr. Ing. Roman MIKLÓŠ 
Prvá stavebná sporiteľňa a.s. 
Bajkalská 30, P. O. Box 48 
829 48  Bratislava 25 
Tel.: +421/ 2 / 582 31 174 
Fax: +421/ 2 / 582 31 109 



Další informace o konferenci Python