【发布时间】:2015-07-23 14:11:53
【问题描述】:
考虑以下代码:
class Foo():
pass
Foo.entries = dict()
a = Foo()
a.entries['1'] = 1
b = Foo()
b.entries['3'] = 3
print(a.entries)
这将打印:
{'1': 1, '3': 3}
因为条目是作为静态属性添加的。有没有办法猴子修补类定义以添加新属性(不使用继承)。
我设法找到了以下方法,但对我来说看起来很复杂:
def patch_me(target, field, value):
def func(self):
if not hasattr(self, '__' + field):
setattr(self, '__' + field, value())
return getattr(self, '__' + field)
setattr(target, field, property(func))
patch_me(Foo, 'entries', dict)
【问题讨论】:
-
您正在添加一个在所有实例之间共享的 类属性。如果将其添加到实例中,实例已经创建是否应该获得新属性?
-
你为什么不能改为
a.entries = {'1': 1}?
标签: python monkeypatching