2017-10-05 85 views
-1

https://stackoverflow.com/a/44880260为什么`object()`没有`__dict__`来支持一些不具有`__dict__`属性的自定义Python类的实例?

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

在“它是所有自定义Python类的基础”中的“它”是指类object或其实例object()?我想上课object

既然是object代替object()这是所有定制的Python类的基,是它也object代替object()其必须支持不具有__dict__属性一些自定义Python类的情况下,当类定义__slots__代替?

因此,如何将我明白object()没有__dict__是支持不具有__dict__属性一些自定义的Python类的实例时的类定义__slots__呢?

谢谢。

回答

1

是的,你的理解是正确的。 object的子类可能不需要__dict__作为它们的实例,但如果object实例有一个,它们的子类实例也会有一个。

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

2

"Notes on using __slots__"

当从一个类继承不__slots__,该类的__dict__属性始终可以访问,所以在子类__slots__定义是没有意义的。

措辞有点不准确;从技术上讲,因为所有的类继承自object(其缺少__slots__),这意味着所有实例都将具有__dict__,但是他们真正想要说的是,如果__dict__未被抑制在继承树的每个级别的实例上(由于失败为object等内建类型提供__dict__,或在用户定义的类上使用__slots__将其抑制),那么__dict__将存在于树中第一个类的实例中,该实例无法抑制__dict__,并且对于其所有子类,即使他们尝试使用__slots__来抑制__dict__

基本上,如果object实例有__dict__,则所有类的所有实例都有它;通过将其抑制在object上,object(阅读:所有类别)的子类保留选项以具有__dict__或不具有__dict__

相关问题