首页 > 解决方案 > 在类装饰器中动态设置属性

问题描述

我想要一个类装饰器,它可以根据类属性向类添加属性_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没有按预期工作?这个问题还有其他解决方案吗?我需要属性是只读的,它们应该出现在类文档中。

标签: pythonooppropertiespython-decorators

解决方案


推荐阅读