[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