Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向python列表对象添加成员变量_Python_Python 3.x_Attributes - Fatal编程技术网

向python列表对象添加成员变量

向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' 有人能解释为什么会这样吗 并非所有对象都支持任意属性分配 大多数内置类型都没有,包括列表、元组、字符串、字节、

在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'

有人能解释为什么会这样吗

并非所有对象都支持任意属性分配

大多数内置类型都没有,包括列表、元组、字符串、字节、字典、集合、布尔值、数字类型等。另一方面,函数对象也有,模块对象也有(这样做时,您将向该模块添加新的全局变量)

换句话说,仅仅因为自定义类和实例支持赋值,并不意味着其他类型也支持赋值。为了支持任意属性,这些类型需要每个实例都有一个
\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'