如果一切都是一个对象,为什么我不能给一些添加属性呢?

2024-10-01 09:38:11 发布

您现在位置:Python中文网/ 问答频道 /正文

如果一切都是对象,那么为什么下面的代码不能工作:

x = 6
x.newAttrib = 8

所以它不是一个物体,或者是一个有限的物体?你知道吗


Tags: 对象代码物体newattrib
1条回答
网友
1楼 · 发布于 2024-10-01 09:38:11

是的,一切都是物体。然而,作为一个对象的一切并不意味着一切都具有任意属性。你知道吗

Python中的整数是对象,具有属性和方法(这些属性和方法只是可调用的属性):

>>> x = 6
>>> x.real
6
>>> x.imag
0
>>> x.bit_length()
3

要支持任意属性,对象需要有__dict__映射。整数没有这样的映射:

>>> x.__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__dict__'

其他对象会这样做,例如函数:

>>> def foo(): pass
...
>>> foo.__dict__
{}
>>> foo.bar = 'baz'

但是__dict__映射是有代价的:这类对象的内存占用更大。因为Python使用了大量的整数,所以给它们一个__dict__映射来节省内存是有意义的。你很少会给他们额外的属性。你知道吗

您可以定义自己的类来生成没有__dict__属性的实例,方法是给类一个^{} class variable;这定义了实例支持的固定属性。这使您可以从相同的内存节约中获益:

>>> class Demo(object):
...     __slots__ = ('foo',)
...
>>> d = Demo()
>>> d.foo = 'bar'
>>> d.bar = 'foo'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Demo' object has no attribute 'bar'

反之亦然,如果您创建了int的子类并且没有给您的子类一个__slots__变量,您可以向该子类添加任意属性:

>>> class MyInt(int):
...     pass
...
>>> mi = MyInt(6)
>>> mi.foo = 'bar'

相关问题 更多 >