Ответ 1
super(Derived, cls).do(a)
РЕДАКТИРОВАТЬ: О, подожди минутку... это не ясно, что именно ты спрашиваешь. Так вы будете вызывать код в версии базового класса метода из производного класса.
Рассмотрим следующий код:
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
Из Derived.do
, как мне позвонить Base.do
?
Я обычно использовал бы super
или даже имя базового класса, если это обычный метод объекта, но, видимо, я не могу найти способ вызвать метод класса в базовом классе.
В приведенном выше примере Base.do(a)
печатает Base
класс вместо класса Derived
.
super(Derived, cls).do(a)
РЕДАКТИРОВАТЬ: О, подожди минутку... это не ясно, что именно ты спрашиваешь. Так вы будете вызывать код в версии базового класса метода из производного класса.
Это было какое-то время, но я думаю, что, возможно, нашел ответ. Когда вы украшаете метод, чтобы стать классом, исходный несвязанный метод хранится в свойстве с именем "im_func":
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.im_func(cls, a)
if __name__ == '__main__':
d = Derived()
d.do('hello')
Это работает для меня:
Base.do('hi')