1

在 Python 3 中没有绑定方法(从 Python 2 已知),但我们总是创建函数。

在类中声明一个函数后,创建自动 Pythons 描述符,该描述符将self作为第一个参数附加,此时该函数将作为实例方法调用。

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

def funcdecorator(func):
    def f(*args, **kwargs):
        print('funcdecorator:', args, kwargs)
    return f

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

X().f()

将输出:

funcdecorator: (<__main__.X object at ...>,) {}

(第一个参数作为 传递self

但使用以下代码:

def classdecorator(func):
    class C:
        def __call__(*args, **kwargs):
            print('classdecorator:', args, kwargs)
    return C()

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

X().f()

我们得到:

classdecorator: (<__main__.C object at 0x1bbea10>,) {}

这是合乎逻辑的。

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

4

1 回答 1

3

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

于 2013-02-01T15:47:06.783 回答