【发布时间】:2020-06-10 10:41:26
【问题描述】:
考虑以下示例:
class A:
def m():
pass
class B(A):
pass
以及以下终端输出:
>>> b = B()
>>> b.m
<bound method A.m of <__main__.B object at 0x000001EFFF24C748>>
>>> super(b.__class__, b).m
<bound method A.m of <__main__.B object at 0x000001EFFF24C748>>
>>> b.m is super(b.__class__, b).m
False
>>> b.m == super(b.__class__, b).m
True
为什么它们相等但不相同?继承时是否复制了该方法?
有没有更好的方法来测试子类是否覆盖了父方法?
【问题讨论】:
-
我认为在将方法绑定到实例时,幕后会发生一些魔法(可能是描述符)。这就是为什么
A.m is B.m为真,而B.m is b.m为假。 -
@AlexanderLekontsev 那里的大多数分析者似乎都在寻求更多需要干预类的迂回解决方案。
-
@myrmica 是对的!
super()返回它在 MRO 列表中找到的第一个方法的绑定版本。每个函数都是一个描述符,为了获得函数的绑定版本,描述符被调用。每次调用描述符时,它都会产生一个不同的函数绑定实例!
标签: python inheritance