首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰器中的Python3绑定方法

装饰器中的Python3绑定方法
EN

Stack Overflow用户
提问于 2013-02-01 22:55:57
回答 1查看 165关注 0票数 1

在Python3中没有绑定方法(在Python2中已知),但我们总是创建函数。

在类中声明一个函数后,会创建自动Python描述符,当这个函数作为实例方法被调用时,它将附加self作为第一个参数。

所以基本上,下面的代码:

代码语言:javascript
复制
def funcdecorator(func):
    def f(*args, **kwargs):
        print('funcdecorator:', args, kwargs)
    return f

class X:
    @funcdecorator
    def f(self):
        pass

X().f()

将输出:

代码语言:javascript
复制
funcdecorator: (<__main__.X object at ...>,) {}

(第一个参数作为self传递)

但使用以下代码:

代码语言:javascript
复制
def classdecorator(func):
    class C:
        def __call__(*args, **kwargs):
            print('classdecorator:', args, kwargs)
    return C()

class X:
    @classdecorator
    def f(self):
        pass

X().f()

我们得到:

代码语言:javascript
复制
classdecorator: (<__main__.C object at 0x1bbea10>,) {}

这是合乎逻辑的。

但是,有没有可能从装饰器返回一个类实例并模仿它是一个函数,所以当“调用”它时,第一个传递的参数将是X的实例,而不是C的实例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-01 23:47:07

C需要是一个descriptor,即实现__get__。然后,X().f()将首先调用描述符的__get__,传递X实例和对X的引用。无论__get__返回什么,都将看到__call__被调用。

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

https://stackoverflow.com/questions/14648975

复制
相关文章

相似问题

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