Hyd*_*S M 4 python attributes python-3.x
在python 3中,您可以在类声明后将成员变量添加到自定义对象:
class a():
pass
b = a()
b.c = 1 #okay
print(b.c) #outputs 1
Run Code Online (Sandbox Code Playgroud)
但是,对列表对象执行相同操作会引发异常:
d = []
d.e = 1 #throws AttributeError: 'list' object has no attribute 'e'
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会这样吗?
并非所有对象都支持任意属性分配.
大多数内置类型都没有,包括列表,元组,字符串,字节,字典,集合,布尔值,数字类型等.另一方面,函数对象和模块对象一样(你要向它添加新的全局变量)你这样做的模块).
换句话说,仅仅因为自定义类和实例支持赋值,并不意味着其他类型也是如此.为了支持任意属性,这些类型需要__dict__每个实例都有一个字典,非常小的内存成本几乎没有什么优势,特别是当典型的Python程序创建了很多这些类型的实例时.
请注意,当您使用该__slots__功能为自定义类保存每个实例内存时,您无法为这些实例分配属性:
>>> class Foo:
... __slots__ = ('spam', 'eggs')
...
>>> foo = Foo()
>>> foo.ham = "won't work"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'ham'
Run Code Online (Sandbox Code Playgroud)
反之,你可以继承内置类型,此时子类不支持的任意属性分配(如子类的实例将有一个__dict__属性):
>>> class FooList(list):
... pass
...
>>> foo_list = FooList()
>>> foo_list.ham = 'This does work'
Run Code Online (Sandbox Code Playgroud)
也就是说,除非你__slots__当然使用.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |