如何在Python中使用装饰器动态创建类方法?

问题描述 投票:0回答:1

我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:

装饰器应该从外部配置(例如字典)读取方法定义。 装饰器应该动态地将这些方法添加到类中。 每个生成的方法都应具有配置中指定的自己唯一的实现。 这是我所想象的粗略轮廓:

method_config = {
    'method1': lambda self: "This is method1",
    'method2': lambda self, arg: f"Method2 received {arg}"
}

@dynamic_methods(method_config)
class MyClass:
    ...
python python-3.x python-decorators
1个回答
0
投票

安全风险

由于装饰器会迭代 method_config,如果此配置来自不受信任的来源,则可能会引入漏洞(代码注入、资源耗尽、覆盖现有方法)。

解决方案

由于 Python 类使用类似字典的机制,因此我们可以利用

setattr

def dynamic_methods(method_config):
    def decorator(cls):
        for method_name, method_impl in method_config.items():
            setattr(cls, method_name, method_impl)
        return cls
    return decorator

method_config = {
    'method1': lambda self: "This is method1",
    'method2': lambda self, arg: f"Method2 received {arg}"
}

@dynamic_methods(method_config)
class MyClass:
    pass

# Usage
obj = MyClass()
print(obj.method1())  # Output: This is method1
print(obj.method2("test"))  # Output: Method2 received test
© www.soinside.com 2019 - 2024. All rights reserved.