Rozważ następujący kod:
class Base(object):
@classmethod
def do(cls, a):
print cls, a
class Derived(Base):
@classmethod
def do(cls, a):
print 'In derived!'
# Base.do(cls, a) -- can't pass `cls`
Base.do(a)
if __name__ == '__main__':
d = Derived()
d.do('hello')
> $ python play.py
> In derived!
> <class '__main__.Base'> msg
Od Derived.do
, jak mam zadzwonić Base.do
?
Normalnie użyłbym super
lub nawet bezpośrednio nazwy klasy bazowej, jeśli jest to normalna metoda obiektu, ale najwyraźniej nie mogę znaleźć sposobu na wywołanie metody class w klasie bazowej.
W powyższym przykładzie, Base.do(a)
drukuje Base
klasy zamiast Derived
klasy.
python
class
overriding
class-method
Sridhar Ratnakumar
źródło
źródło
Odpowiedzi:
Jeśli używasz klasy nowego stylu (tzn. Pochodzi z
object
Pythona 2 lub zawsze z Pythona 3), możesz to zrobić wsuper()
następujący sposób:W ten sposób można wywołać kod w wersji metody klasy bazowej (tj.
print cls, a
) Z klasy pochodnej,cls
ustawiając go na klasę pochodną.źródło
super
metod klasowych.object
. (przynajmniej w Pythonie 2, ale w Py3 myślę, że wszystkie klasy są w nowym stylu, IIRC) W przeciwnym razieBase.do(self, ...)
, myślę, że musisz to zrobić , tym samym zakodując na stałe nazwę nadklasy.Derived.do()
, to niecls
to samo coDerived
?Derived
podklasy, ale nie jej, to tak.to było jakiś czas, ale myślę, że mogłem znaleźć odpowiedź. Kiedy dekorujesz metodę, aby stała się metodą klasową, oryginalna niezwiązana metoda jest przechowywana we właściwości o nazwie „im_func”:
źródło
__func__
python 2.7 i 3To działa dla mnie:
źródło
cls
Argumentem zostanie związanyBase
zamiastDerived