【发布时间】:2022-01-21 22:12:17
【问题描述】:
我正在尝试装饰一个函数并让装饰器将其转换为一个类。
我目前有这样的课程:
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
有没有办法做到这一点?
【问题讨论】:
-
你的意思是不工作...?另外,如果你装饰一个函数,你返回的应该仍然是一个函数,或者至少是一个 callable 对象,
BaseCore是否实现了__call__? IE。BaseCore实例是否可调用?如果没有,这没有多大意义。 -
我收到了
topics = topics NameError: name 'topics' is not defined。但是没有 -BaseCore没有实现。 -
NewCore.run = types.MethodType(lambda cls, topic, payload: func(topic, payload), BaseCore)**没有**。MethodType对象不属于该类。它应该只是一个普通的函数对象*,否则它不会工作 -
除非我将其转换为 MethodType,否则它将无法正常工作(请参阅 pastebin.com/daB1KGc7)
标签: python python-3.x python-decorators python-class