虚拟场景:
# where I want to collect my decorated callbacks
cbs = []
# decorator to mark a callback to be collected
def my_deco(cb):
cbs.append(cb)
return cb
class C:
@my_deco
@classmethod
def cm(cls):
...
# execute the collected callbacks
for cb in cbs:
cb()
我的目标是拥有一个
my_deco
装饰器来收集一些回调并在给定时间执行它们
我可以将
my_deco
应用于普通函数,并且它们会被正常收集和调用。我也可以在 my_deco(C.cm)
定义之后调用 C
,并且收集的方法可以正常调用。
在示例中 - 但是 - 我想在
my_deco
的定义中应用 class C
。
我很难理解如何检测
classmethod
对象(atm 我正在检查是否 isinstance(cb, classmethod)
但我不确定是否正确C
类本身:假设它是一个classmethod
实例,我的理解是这是一个“无界”方法,例如调用需要手动设置cls
参数。但我不知道如何在 C
实现中检索 my_deco
出现此错误消息是因为您尝试像常规方法一样调用“classmethod”,但它是“classmethod”类型的对象。
为了避免这种情况,您可以使用 classmethod 对象的
__get__
dunder 方法 cb
来获取如下可调用对象:
for cb in cbs:
cb.__get__(C)()