首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在装饰器上使用方法吗?

可以在装饰器上使用方法吗?
EN

Stack Overflow用户
提问于 2020-08-06 18:21:01
回答 1查看 124关注 0票数 0

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

代码语言:javascript
复制
@pc.on("datachannel")
    def on_datachannel(channel):
    ...

我真的不明白这是如何工作的,或者这段代码是做什么的。我一直在搜索装饰器,我知道有可能有类装饰器,但没有使用方法。有没有人能详细说明一下?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 18:37:50

代码语言:javascript
复制
@foo
def bar(): ...

这种语法只是为了实现以下目的:

代码语言:javascript
复制
def bar(): ...
bar = foo(bar)

所以,这是:

代码语言:javascript
复制
@pc.on('datachannel')
def on_datachannel(channel): ...

与以下内容相同:

代码语言:javascript
复制
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的实现如下所示:

代码语言:javascript
复制
class PC:
    def on(self, event):
        ...
        def wrapper(fn):
            ...
            def inner_wrapper(*args, **kwargs):
                ...
                fn(*args, **kwargs)

            return inner_wrapper

        return wrapper

pc = PC()

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63281498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档