我正在开发一个Python项目,我需要在运行时动态地为类创建方法。我想使用装饰器根据一些外部配置将这些方法添加到类中。要求是:
装饰器应该从外部配置(例如字典)读取方法定义。 装饰器应该动态地将这些方法添加到类中。 每个生成的方法都应具有配置中指定的自己唯一的实现。 这是我所想象的粗略轮廓:
method_config = {
'method1': lambda self: "This is method1",
'method2': lambda self, arg: f"Method2 received {arg}"
}
@dynamic_methods(method_config)
class MyClass:
...
由于装饰器会迭代 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