python - 在类装饰器中动态设置属性
问题描述
我想要一个类装饰器,它可以根据类属性向类添加属性_arg_names
,就像这个最小的例子一样:
def add_properties(cls):
for name in cls._arg_names:
setattr(cls, name, property(lambda self: getattr(self, '_' + name)))
return cls
@add_properties # .a->._a, .b->._b
class A():
_arg_names = ('a', 'b')
def __init__(self):
self._a = 1
self._b = 2
但是,当我运行它时,我发现所有属性都指向最后一个参数名称:
>>> x = A()
>>> x.a
2
>>> x.b
2
任何想法为什么内部的封闭property
没有按预期工作?这个问题还有其他解决方案吗?我需要属性是只读的,它们应该出现在类文档中。