Вызов метода класса базового класса в Python

Рассмотрим следующий код:

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.

Ответ 1

super(Derived, cls).do(a)

РЕДАКТИРОВАТЬ: О, подожди минутку... это не ясно, что именно ты спрашиваешь. Так вы будете вызывать код в версии базового класса метода из производного класса.

Ответ 2

Это было какое-то время, но я думаю, что, возможно, нашел ответ. Когда вы украшаете метод, чтобы стать классом, исходный несвязанный метод хранится в свойстве с именем "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')

Ответ 3

Это работает для меня:

Base.do('hi')