gpt4 book ai didi

python - Python 中哪些对象可以动态添加属性?

转载 作者:太空狗 更新时间:2023-10-30 01:26:24 25 4
gpt4 key购买 nike

在 Python 中,我可以向我之前定义的类 C 添加一个属性。但是,我无法将属性添加到 list - 生成的错误消息解释说这是因为 list 是内置类型:

>>> class C: pass
...
>>> C.foo = 1
>>> C.foo
1

>>> list.foo = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'list'

同样,可以将属性添加到 C 的实例,但不能添加到 list 的实例。然而,在这种情况下,错误消息更加模糊:

>>> o = C()
>>> o.bar = 2
>>> o.bar
2

>>> o = []
>>> o.bar = 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'bar'

为什么我不能将成员添加到 list 的实例中?还是因为 list 是内置类型?

更一般地说,Python 中的哪些对象可以动态添加属性?

最佳答案

在对象上设置任意属性时,这会有效地改变对象的 __dict____dict__ 是一个存储对象所有成员的字典。所以要给一个对象添加成员,有两个条件:

  1. 对象需要有一个__dict__
  2. 对象的 __dict__ 需要是可变的。

其中一个条件可能不成立的原因有多种。以下类别的类型通常不允许对象修改:

  • 内置 native 类型在 native 代码中实现,并具有一组固定的成员,并嵌入到它们的 native 对象定义中。示例包括 intstrlistbytes,……可能是大多数(但不是全部)built-in types
  • 本地 来自外部库的类型,例如 numpy 的东西。
  • 任何使用 __slots__ 的 Python 类. Slots 是一种明确的方式来关闭 __dict__ 并将其替换为一组固定的成员。很明显,这将阻止以后添加到对象(根据设计)。

检测是否可以修改对象的好方法是什么?好吧,从上面检查条件。对象是否有__dict__:

>>> class Example:
pass
>>> class SlotsExample:
__slots__ = ['x']

>>> hasattr(Example(), '__dict__')
True
>>> hasattr(SlotsExample(), '__dict__')
False
>>> hasattr(list, '__dict__')
True
>>> hasattr([], '__dict__')
False

__dict__ 是否是真正的字典:

>>> isinstance(Example().__dict__, dict)
True
>>> isinstance(list.__dict__, dict)
False

关于python - Python 中哪些对象可以动态添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46535870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com