来自Dict的子类违反了python中面向对象编程的基本规则

s32*_*280 4 python oop

我要求更好地了解作者对特定代码段的评论.为了详细说明,我将举例说明.

 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.我想知道我的解释是否正确?你对作者评论有什么其他解释吗?

Roh*_*hit 5

我无法评论" 内置行为违反了面向对象编程的基本规则: ".但是在你的代码中,发生了两件截然不同的事情.

当你这样做

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你已经覆盖的方法中寻找方法,因此它被调用并且你得到了预期的结果.

其所有相关的superMRO.MRO只需检查__mro__属性,您就可以轻松查看任何类.

In[5]: a = 100
In[6]: a.__class__.__mro__
Out[6]: (int, object)
Run Code Online (Sandbox Code Playgroud)

上面的示例仅适用于内置类,但同样适用于任何其他自定义类.