Skip to main content
 首页 » 编程设计

python之通过装饰器将实例变量动态添加到Python中的类

2025年05月04日19mfrbuaa

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

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

执行此操作的 pythonic 方法是什么,同时允许类作者控制他们放入 __ init __ 中的内容?

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