0

当我注意到一个装饰器上有一个方法时,我正在查看 aiortc 示例:

@pc.on("datachannel")
    def on_datachannel(channel):
    ...

我真的不明白这是如何工作的或这段代码是做什么的。我一直在寻找装饰器,我知道有可能有类装饰器,但没有关于使用方法。谁能详细说明这一点?

4

1 回答 1

1
@foo
def bar(): ...

此语法只是为此的糖:

def bar(): ...
bar = foo(bar)

所以这:

@pc.on('datachannel')
def on_datachannel(channel): ...

是相同的:

def on_datachannel(channel): ...
on_datachannel = pc.on('datachannel')(on_datachannel)

pc是某个对象,pc.on是它的一个方法,pc.on('datachannel')调用它并返回一个函数,pc.on('datachannel')(on_datachannel)调用返回的函数并传递给它on_datachannel函数。

的实现pc.on是这样的:

class PC:
    def on(self, event):
        ...
        def wrapper(fn):
            ...
            def inner_wrapper(*args, **kwargs):
                ...
                fn(*args, **kwargs)

            return inner_wrapper

        return wrapper

pc = PC()

所有这些内部部分完全是一个接受参数的常规装饰器。它是在一个类上定义的,这对它没有任何影响。

于 2020-08-06T10:37:49.867 回答