簡體   English   中英

如何使用 Python 中的裝飾器模式根據字典中的數據向 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM