![](/img/trans.png)
[英]Python dynamically add decorator to class' methods by decorating class
[英]How can I use the decorator pattern in Python to dynamically add methods to a class based on data in a dictionary?
考慮這樣一種情況,您有一個基本的 class Animal
,並且您希望根據存儲在字典中的數據向 class 添加新方法。 字典中的數據將方法名映射到函數,你想使用裝飾器模式將這些方法動態添加到class。
例如,假設字典定義如下:
methods = {
"walk": lambda self: print(f"{self.name} is walking"),
"run": lambda self: print(f"{self.name} is running"),
}
基數 class 定義為:
class Animal:
def __init__(self, name):
self.name = name
如何使用裝飾器模式將字典中定義的方法動態添加到Animal
class 中?
我嘗試使用標准裝飾器向class添加方法,但這種方法一次只能添加一個方法,無法根據字典中的數據動態添加多個方法。
我希望找到一種方法,根據字典中的數據,將方法動態添加到 class 中,這樣我就可以在一行代碼中將多個方法添加到 class 中。 我一直在尋找一種使用裝飾器模式的解決方案,因為它是向 Python 中的類添加行為的常用方法。
methods = {
"walk": lambda self: print(f"{self.name} is walking"),
"run": lambda self: print(f"{self.name} is running"),
}
def my_decorator(cls: type):
for name, method in methods.items():
setattr(cls, name, method)
return cls
@my_decorator
class Animal:
def __init__(self, name):
self.name = name
animal = Animal("name")
animal.run()
替代方案(裝飾工廠)
from typing import Callable
methods = {
"walk": lambda self: print(f"{self.name} is walking"),
"run": lambda self: print(f"{self.name} is running"),
}
def my_decorator(methods: dict[str, Callable]):
def decorator(cls: type):
for name, method in methods.items():
setattr(cls, name, method)
return cls
return decorator
@my_decorator(methods)
class Animal:
def __init__(self, name):
self.name = name
animal = Animal("name")
animal.run()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.