【发布时间】:2018-04-18 00:07:03
【问题描述】:
我尝试从__init_subclass__ 中访问父级的类方法,但这似乎不起作用。
假设如下示例代码:
class Foo:
def __init_subclass__(cls):
print('init', cls, cls.__mro__)
super(cls).foo()
@classmethod
def foo(cls):
print('foo')
class Bar(Foo):
pass
产生以下异常:
AttributeError: 'super' object has no attribute 'foo'
cls.__mro__ 然而表明Foo 是它的一部分:(<class '__main__.Bar'>, <class '__main__.Foo'>, <class 'object'>)。
所以我不明白为什么super(cls).foo() 不发送到Foo.foo。有人可以解释一下吗?
【问题讨论】:
-
将
super(cls)更改为super(cls, cls)。使用单参数形式,您最终会在Foo(即object)的父类中寻找foo方法。 -
你为什么在这里使用
super(cls)?未绑定的超级很少有用,而且它们不是您要在这里寻找的。如果您只是想调用cls的foo类方法的父类,那就是super(cls, cls).foo(),就像您使用方法的实例一样。如果你想做一些不同的事情……那又怎样? -
如果您真的想了解为什么这并不能如您所愿,您需要先了解一些背景知识,然后才能对其进行解释。你知道什么是描述符,方法一般是如何工作的,超级一般是如何工作的,并且只需要知道未绑定的超级是如何工作的吗?还是您需要解释这些更基本的部分之一?
-
@abarnert 诚然,我以前从未使用过 unbound super 并且可能被 the docs 弄糊涂了:super([type[, object-or-type]]) 返回一个代理对象,它将方法调用委托给类型的父类或同级类。 [...]。所以我可能需要对此进行复习;其余的我都熟悉。但最后你提到的还是有道理的。
标签: python inheritance python-3.6 class-method