为什么`object()`没有`__dict__`来支持一些不具有`__dict__`属性的自定义Python类的实例?

时间:2017-10-05 00:11:38

标签: python python-3.x

来自https://stackoverflow.com/a/44880260

  

object()不支持实例属性,因为它是所有自定义Python类的基础,必须support not having a __dict__ attribute when defining slots instead

“它是所有自定义Python类的基础”中的“it”是否意味着类object或其实例object()?我想上课object

由于它是object而不是object(),它是所有自定义Python类的基础,它是object而不是object(),它必须支持某些实例在定义__dict__的类时,自定义Python类没有__slots__属性?

那么我怎么理解object()没有__dict__来支持定义__dict__的类时没有__slots__属性的一些自定义Python类的实例?

感谢。

2 个答案:

答案 0 :(得分:2)

根据"Notes on using __slots__"

  

从没有__slots__的类继承时,该类的__dict__属性将始终可访问,因此子类中的__slots__定义毫无意义。

措辞有点不精确;从技术上讲,由于所有类都继承自object(缺少__slots__),这意味着实例都会有__dict__,但他们真正想说的是{{1}在继承树的每个级别的实例上都没有被抑制(因为没有为__dict__提供内置类型__dict__,或者在用户定义的类上用object抑制它然后,对于树中第一个类的实例,__slots__将无法取消__dict__,并且对于它的所有子类,即使它们尝试使用__dict__来抑制{ {1}}。

基本上,如果__slots__个实例有__dict__,那么所有类的所有实例都会拥有它;通过在object上取消它,__dict__的子类(读取:所有类)将选项保留为object

答案 1 :(得分:1)

是的,您的理解是正确的。 object的子类可能不希望它们的实例有__dict__,但如果object个实例有一个,它们的子类实例也会有一个。

问题主要在于object是Python中所有其他类的父类。如果它的设计使其实例具有__dict__,那么__dict__将由所有类的所有实例继承。