gpt4 book ai didi

python3 : bind method to class instance with . __get__(),它有效,但为什么呢?

转载 作者:太空狗 更新时间:2023-10-29 21:44:25 25 4
gpt4 key购买 nike

我知道如果你想给一个类实例添加一个方法你不能像这样做一个简单的赋值:

>>> def print_var(self): # method to be added
print(self.var)
>>> class MyClass:
var = 5
>>> c = MyClass()
>>> c.print_var = print_var

这确实会导致 print_var 表现得像一个普通函数,所以 self 参数不会有他的典型含义:

>>> c.print_var
<function print_var at 0x98e86ec>
>>> c.print_var()
Traceback (most recent call last):
File "<pyshell#149>", line 1, in <module>
c.print_var()
TypeError: print_var() takes exactly 1 argument (0 given)

为了让函数被认为是一个方法(即将它绑定(bind)到实例),我曾经使用这样的代码:

>>> import types
>>> c.print_var = types.MethodType(print_var, c)
>>> c.print_var
<bound method MyClass.print_var of <__main__.MyClass object at 0x98a1bac>>
>>> c.print_var()
5

但我发现 .__get__ 也可以用于此目的:

>>> c.print_var = print_var.__get__(c)
>>> c.print_var
<bound method MyClass.print_var of <__main__.MyClass object at 0x98a1bac>>
>>> c.print_var()
5

这里的问题是它只是工作,但我不明白如何以及为什么。关于 .__get__ 的文档似乎没有太大帮助。

如果有人能澄清 python 解释器的这种行为,我将不胜感激。

最佳答案

您要查找的信息在 Descriptor HowTo Guide 中:

To support method calls, functions include the __get__() method for binding methods during attribute access. This means that all functions are non-data descriptors which return bound or unbound methods depending whether they are invoked from an object or a class. In pure Python, it works like this:

class Function(object):
. . .
def __get__(self, obj, objtype=None):
"Simulate func_descr_get() in Objects/funcobject.c"
return types.MethodType(self, obj)

所以确实没有发生任何奇怪的事情——函数对象的 __get__ 方法调用 types.MethodType 并返回结果。

关于python3 : bind method to class instance with . __get__(),它有效,但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7490879/

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