【发布时间】:2017-10-04 22:33:38
【问题描述】:
来自https://stackoverflow.com/a/1529099/156458
要支持任意属性分配,对象需要
__dict__: 与对象关联的字典,其中可以是任意属性 存储。否则,无处可放新属性。
object的实例不携带__dict__-- 如果有, 在可怕的循环依赖问题之前(因为__dict__,像大多数 其他一切,继承自object;-),这会让每个人都感到不安 Python 中带有 dict 的对象,这意味着很多开销 当前没有或不需要字典的每个对象的字节数 (本质上,所有不能任意分配的对象 属性没有或不需要字典)。...
当类具有
__slots__特殊属性(字符串序列)时,class语句(更准确地说,默认元类type)不装备每个实例该类具有__dict__(因此能够具有任意属性),只是具有给定名称的一组有限的、刚性的“插槽”(基本上每个位置都可以包含对某个对象的一个引用)。
如果一个对象没有__dict__,那么它的类是否必须有__slots__ 属性?
例如object 的实例没有__dict__,
>>> object().__dict__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'
但是
>>> object.__slots__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'object' has no attribute '__slots__'
那么为什么object 的实例没有__dict__ 而object 没有__slots__ 属性?
object 的实例是否有任何属性?
有多少种可能性:
- 一个对象有
__dict__,它的类有__dict__但没有__slots__ - 一个对象没有
__dict__,它的类有__slots__ - 一个对象没有
__dict__,它的类也没有__slots__?
是否可以判断一个对象是否有来自其类的__dict__?
- 如果它的类有
__slots__,那么它就没有__dict__ - 如果它的类没有
__slots__,我怎么知道它是否有__dict__?
【问题讨论】:
-
偶尔看到一个非家庭作业的问题令人耳目一新。
-
这些规则不一定适用于内置类或在扩展模块中用 C 实现的类。
-
我想你只是证明了不,如果一个类型没有
__dict__,则不需要__slots__ -
注意
__slots__可以在类创建时间后删除。 -
@o11c:嗯,是的,这给整个交易增加了一层潜在的误导。
标签: python python-3.x