向python列表对象添加成员变量
在python 3中,可以在类声明之后向自定义对象添加成员变量:向python列表对象添加成员变量,python,python-3.x,attributes,Python,Python 3.x,Attributes,在python 3中,可以在类声明之后向自定义对象添加成员变量: class a(): pass b = a() b.c = 1 #okay print(b.c) #outputs 1 但是,对列表对象执行相同操作会引发异常: d = [] d.e = 1 #throws AttributeError: 'list' object has no attribute 'e' 有人能解释为什么会这样吗 并非所有对象都支持任意属性分配 大多数内置类型都没有,包括列表、元组、字符串、字节、
class a():
pass
b = a()
b.c = 1 #okay
print(b.c) #outputs 1
但是,对列表对象执行相同操作会引发异常:
d = []
d.e = 1 #throws AttributeError: 'list' object has no attribute 'e'
有人能解释为什么会这样吗 并非所有对象都支持任意属性分配 大多数内置类型都没有,包括列表、元组、字符串、字节、字典、集合、布尔值、数字类型等。另一方面,函数对象也有,模块对象也有(这样做时,您将向该模块添加新的全局变量) 换句话说,仅仅因为自定义类和实例支持赋值,并不意味着其他类型也支持赋值。为了支持任意属性,这些类型需要每个实例都有一个
\uuuu dict\uuuu
字典,这是一个非常小的优势,特别是当一个典型的Python程序创建了大量这些类型的实例时
请注意,当使用为自定义类保存每个实例的内存时,也不能为这些实例指定属性:
>>> 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'
也就是说,除非您使用
\uuuuu插槽
当然。正如Martijn Pieters所说,我们不能为它们添加属性。但是您可以继承它们并重写setattribute()方法来完成此任务。Python中没有\uuuuuuuuuuuuuuuu
方法。也许你的意思是?你不需要使用这个方法,子类可以有任意的属性分配给它们。哦,这很有意义!非常感谢。我将把这个标记为答案。
>>> class FooList(list):
... pass
...
>>> foo_list = FooList()
>>> foo_list.ham = 'This does work'