如何修饰一个函数并在 python 中得到一个 class

How to decorate a function and get a class in python

我正在尝试装饰一个函数并让装饰器将其转换为 class。

我目前有一个 class 这样的:

class Licht(BaseCore):
    topics = ["glados/tcs/licht/set"]

    @classmethod
    def run(cls, topic, payload):
        mqtt_publish("tcs/bus/cmd", "1200")

然后我试着装饰它,让它看起来更漂亮:

@core_factory(["glados/tcs/licht/set"])
def Licht(topic, payload):
    mqtt_publish("tcs/bus/cmd", "1200")

这是我当前的装饰器代码,它不起作用:

def core_factory(topics):
    class NewCore(BaseCore):
        topics = topics
    def inner(func):
        import types
        NewCore.run = types.MethodType(lambda cls, topic, payload: func(topic, payload), BaseCore)
        return NewCore
    return inner

有办法实现吗?

您的装饰器应该 return 一个接受装饰函数并创建一个 class 其 run 方法仅调用装饰函数的函数。

def core_factory(topics):
    def wrapper(f):

        class _(BaseCore):
            @classmethod
            def run(cls, topic, payload):
                return f(topic, payload)

        _.topics = topics
        _.__name__ = f.__name__

        return _
    return wrapper

@core_factory(["glados/tcs/licht/set"])
def Licht(topic, payload):
    mqtt_publish("tcs/bus/cmd", "1200")