为什么我们必须使用__getitem__而不是通常的操作员访问?
class MyDict(dict):
def __getitem__(self, key):
return super()[key]
Run Code Online (Sandbox Code Playgroud)
我们得到了TypeError: 'super' object is not subscriptable.
相反,我们必须使用super().__getitem__(key),但我从未完全理解为什么 - 它究竟是什么阻止了超级操作以允许操作员访问的方式?
标化只是一个例子,我也有同样的问题__getattr__,__init__等等.
本文档试图解释为什么,但我不明白.
假设A是父类,B并且b是其实例B.然后A可以使用super:调用override方法super(B, b).method().
文档在其基本调用中声明" str(object)返回object.__str__()".
它应该遵循str(super(B, b)) == super(B, b).__str__(),但事实并非如此(交互式版本):
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"
Run Code Online (Sandbox Code Playgroud)
那我哪里出错了?超级机制不适用于魔术方法吗?难道str不能调用__str__在这种情况下?它与本段有关:
请注意,它
super()是作为显式点状属性查找的绑定过程的一部分实现的,例如super().__getitem__(name).它通过实现自己的__getattribute__()方法以可预测的顺序搜索类来支持协作多重继承.因此,super()对于使用语句或运算符(例如)的隐式查找,未定义super()[name].