python:动态地向内置类添加属性

时间:2012-01-12 22:16:25

标签: python attributes python-3.x subclass

为什么它不适用于内置类?

使用子类是解决它的最佳方法,还是会遇到一些隐藏的问题?

a = {}
a.p = 1 # raises AttributeError
class B(dict):
  pass
b = B()
b.p = 1 # works

编辑:我原来的评论认为它对b不起作用是不正确的(我犯了一个错误)。

2 个答案:

答案 0 :(得分:4)

内置类无法拥有任意属性。这是出于性能原因,特别是内存使用的原因,您希望listdict这样的内置类尽可能小,因此您可以拥有其中许多类。

因此,内置类没有任意属性所需的__dict__字典。

您可以为您的课程实现相同的目标。如果它们是用C语言编写的,那么您根本就不会实现__dict__支持。如果它们是用Python编写的,那么使用slots

答案 1 :(得分:0)

如果您想要dict的子类,则可以始终使用UserDicthere the documentation)。

它适用于你想要做的事情:

from collections import UserDict

a = UserDict()
a.p = 10 # works fine