假设
A
是B
的父类,b
是B
的实例.然后可以用super:super(B, b).method()
调用A
的重写方法.docs在其基本调用中声明"
str(object)
returnsobject.__str__()
".
应该遵循str(super(B, b)) == super(B, b).__str__()
,但事实并非如此(interactive version):
class A:
def __str__(self):
return "A"
class B(A):
def __str__(self):
return "B"
b = B()
b_super = super(B, b)
print(str(b_super)) # "<super: <class 'B'>, <B object>>"
print(b_super.__str__()) # "A"
我哪里出了问题?超级机制对魔法方法不起作用吗?在这种情况下,str
不调用__str__
吗?与本段有关:
请注意,
super()
是作为显式虚线属性查找(如super().__getitem__(name)
)绑定过程的一部分实现的.它通过实现自己的__getattribute__()
方法来实现这一点,以支持协作多重继承的可预测顺序搜索类.因此,对于使用语句或运算符(例如super()[name]
)的隐式查找,super()
是未定义的.