为什么自定义类型可以接受临时属性,而内置类型却不可以?
我想知道为什么我们可以为自定义类型的实例创建一个新的属性(“新”是指“在类体中之前没有定义过的”),但对于内置类型,比如object
本身,却做不到这一点。
下面是一个代码示例:
>>> class SomeClass(object):
... pass
...
>>> sc = SomeClass()
>>> sc.name = "AAA"
>>> sc.name
'AAA'
>>> obj = object()
>>> obj.name = "BBB"
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'object' object has no attribute 'name'
1 个回答
6
有些对象没有 __dict__ 属性(这个属性是一个字典,用来存储所有自定义的“新定义”的属性)。你可以通过使用 __slots__ 变量来模拟相同的行为(可以查看 python 参考文档)。当你在一个有 __dict__ 的类上进行继承时,__slots__ 变量就没有效果。而且,因为你在新式类中总是继承 object,所以 object 不能有 __dict__,否则就无法使用 __slots__。没有 __slots__ 的类占用的内存更少,运行速度可能也稍微快一些。