gpt4 book ai didi

来自装饰器的 Python3 边界方法

转载 作者:行者123 更新时间:2023-11-30 23:38:22 26 4
gpt4 key购买 nike

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

在类中声明函数后,会创建自动 Python 描述符,当该函数作为实例方法调用时,它将附加 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

最佳答案

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

关于来自装饰器的 Python3 边界方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14648975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com