我希望有一个类装饰器,它根据类属性_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
内的闭包没有按预期工作的任何想法?这个问题还有其他解决方案吗?我需要将属性设置为只读,并且它们应该出现在类文档中。