我想通过装饰器对一个类进行检测,以添加一些由该类的作者指定的实例变量。

我从以下代码开始,但这只是添加了类变量,并且我想要实例变量(通常在__ init __中“声明”的那些实例变量)

在允许类作者控制他们在__ init __中放置的内容的同时,pythonic的方法是什么?

def add_list_attributes(klass):
    for attribute in klass.list_attributes:
        setattr(klass, attribute, [])

    return klass

@add_list_attributes
class Person(object):

    list_attributes = [
        'phone_numbers'
    ]

    def __init__(self):
        pass

p1 = Person()
p1.phone_numbers.append('01234')

print p1.phone_numbers

最佳答案

您可以创建一个自定义的__new__方法:

def add_list_attributes(klass):
    def new(cls, *args, **kwargs):
        result = super(cls, cls).__new__(cls)
        for attribute in klass.list_attributes:
            setattr(result, attribute, [])
        return result
    klass.__new__ = staticmethod(new)
    return klass

@add_list_attributes
class Person(object):
    list_attributes = [
        'phone_numbers'
    ]
    def __init__(self):
        pass

p1 = Person()
p2 = Person()
p1.phone_numbers.append('01234')

print p1.phone_numbers, p2.phone_numbers

关于python - 通过装饰器将实例变量动态添加到Python中的类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3265770/

10-11 07:39