2024-10-01 09:38:11 发布
网友
如果一切都是对象,那么为什么下面的代码不能工作:
x = 6 x.newAttrib = 8
所以它不是一个物体,或者是一个有限的物体?你知道吗
是的,一切都是物体。然而,作为一个对象的一切并不意味着一切都具有任意属性。你知道吗
Python中的整数是对象,具有属性和方法(这些属性和方法只是可调用的属性):
>>> x = 6 >>> x.real 6 >>> x.imag 0 >>> x.bit_length() 3
要支持任意属性,对象需要有__dict__映射。整数没有这样的映射:
__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__变量,您可以向该子类添加任意属性:
int
__slots__
>>> class MyInt(int): ... pass ... >>> mi = MyInt(6) >>> mi.foo = 'bar'
是的,一切都是物体。然而,作为一个对象的一切并不意味着一切都具有任意属性。你知道吗
Python中的整数是对象,具有属性和方法(这些属性和方法只是可调用的属性):
要支持任意属性,对象需要有
__dict__
映射。整数没有这样的映射:其他对象会这样做,例如函数:
但是
__dict__
映射是有代价的:这类对象的内存占用更大。因为Python使用了大量的整数,所以给它们一个__dict__
映射来节省内存是有意义的。你很少会给他们额外的属性。你知道吗您可以定义自己的类来生成没有} class variable ;这定义了实例支持的固定属性。这使您可以从相同的内存节约中获益:
__dict__
属性的实例,方法是给类一个^{反之亦然,如果您创建了
int
的子类并且没有给您的子类一个__slots__
变量,您可以向该子类添加任意属性:相关问题 更多 >
编程相关推荐