调用`@classmethod`注释方法

问题描述 投票:0回答:1

虚拟场景:

# 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
。 我很难理解如何检测

  1. 我正在装饰一个
    classmethod
    对象(atm 我正在检查是否
    isinstance(cb, classmethod)
    但我不确定是否正确
  2. 如何检索
    C
    类本身:假设它是一个
    classmethod
    实例,我的理解是这是一个“无界”方法,例如调用需要手动设置
    cls
    参数。但我不知道如何在
    C
    实现中检索
    my_deco
python python-3.x python-decorators class-method
1个回答
0
投票

出现此错误消息是因为您尝试像常规方法一样调用“classmethod”,但它是“classmethod”类型的对象。

为了避免这种情况,您可以使用 classmethod 对象的

__get__
dunder 方法
cb
来获取如下可调用对象:

for cb in cbs:
    cb.__get__(C)()
© www.soinside.com 2019 - 2024. All rights reserved.