如何修饰一个函数并在 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")
我正在尝试装饰一个函数并让装饰器将其转换为 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")