我要求更好地了解作者对特定代码段的评论.为了详细说明,我将举例说明.
class DoppelDict(dict):
def __setitem__(self, key, value):
super().__setitem__(key, [value] * 2)
# case 1.
dd = DoppelDict(one=1)
print(dd) # {'one':1}
# case 2.
dd['two'] = 2
print(dd) # {'one':1,'two':[2,2]}
Run Code Online (Sandbox Code Playgroud)
上面的例子是从一本书中挑选的,作者评论"内置行为违反了面向对象编程的基本规则:搜索方法应始终从目标实例的类(self)开始,即使调用发生在超类中实现的方法中.
我相信作者试图表达,因为python忽略了由用户定义的类重写的特殊方法,它违反了OOP.我想知道我的解释是否正确?你对作者评论有什么其他解释吗?
我无法评论" 内置行为违反了面向对象编程的基本规则: ".但是在你的代码中,发生了两件截然不同的事情.
当你这样做
dd = DoppelDict(one=1)
Run Code Online (Sandbox Code Playgroud)
这样就查找__init__了MRO,因为你的类没有覆盖__init__,所以调用类的__init__方法.superdict
但是,当你这样做
dd['two'] = 2
Run Code Online (Sandbox Code Playgroud)
python __setitem__在MRO你已经覆盖的方法中寻找方法,因此它被调用并且你得到了预期的结果.
其所有相关的super和MRO.MRO只需检查__mro__属性,您就可以轻松查看任何类.
In[5]: a = 100
In[6]: a.__class__.__mro__
Out[6]: (int, object)
Run Code Online (Sandbox Code Playgroud)
上面的示例仅适用于内置类,但同样适用于任何其他自定义类.