Рассмотрим следующий код:
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
class вместо Derived
class.
python
class
overriding
class-method
Шридхар Ратнакумар
источник
источник
Ответы:
Если вы используете класс нового стиля (т.е. производный от
object
Python 2 или всегда от Python 3), вы можете сделать этоsuper()
следующим образом:Вот как вы вызываете код в версии метода (т. Е.
print cls, a
) Базового класса из производного класса сcls
установкой на производный класс.источник
super
методы класса.object
. (по крайней мере, в Python 2, но в Py3 я думаю, что все классы являются новым стилем, IIRC) В противном случае вамBase.do(self, ...)
, как мне кажется, придется жестко кодировать имя суперкласса.Derived.do()
неcls
то же самое, чтоDerived
?Derived
подкласса, но не подкласса, тогда да.это было давно, но я думаю, что нашел ответ. Когда вы украшаете метод так, чтобы он стал методом класса, исходный несвязанный метод сохраняется в свойстве с именем im_func:
источник
__func__
в python 2.7 и 3Это работает для меня:
источник
cls
аргумент будет привязан кBase
вместоDerived