gpt4 book ai didi

python - 为什么绑定(bind)类实例方法与绑定(bind)类方法不同?

转载 作者:行者123 更新时间:2023-12-04 04:28:16 24 4
gpt4 key购买 nike

我正在阅读 python docs并偶然发现以下几行:

It is also important to note that user-defined functions which are attributes of a class instance are not converted to bound methods; this only happens when the function is an attribute of the class.


请有人用简单的英语解释一下这是什么意思。
我将介绍一些速记符号:
让“用户定义的函数”用 f 表示,
让“类实例”由 ci 表示,而类仅由 c 表示。显然(?),ci = c(),有一些符号滥用。
此外,允许以简单的集合表示法重铸成员资格声明,例如,“作为类实例属性的用户定义函数”简写为“vf: fεa(ci)”,其中 v: 'for all' 和 where 'a'是(一组)属性(例如,类或类实例的)的简写,“ε”表示集合成员函数。
此外,绑定(bind)函数的过程用 ci.f(*args) 或 c.f(*args) => f(ci, *args) 或 f(c, *args) 简写描述(前者指的是一个实例方法调用,而后者指的是类方法调用)
使用新引入的速记符号,文档中的引用是否暗示
vf: fεa(c), c.f(*args) => f(c, *args) 是一个真实的陈述
尽管
vf: fεa(ci), ci.f(*args) => f(ci, *args) 是假的?

最佳答案

将用户定义的方法设置为类的属性,错误的方式
考虑以下示例类 A和功能 f :


class A:
pass

def f(self):
print("I\'m in user-defined function")

a = A()

函数 f是单独定义的,不在类内部。
假设您要添加功能 f成为 a 的实例方法目的。
添加它,通过设置 fa属性,不起作用:
import types

class A:
pass

def f(self):
print("I\'m in user-defined function")

a = A()
a.f = f

# <function f at 0x000002D81F0DED30>
print(a.f)

# TypeError: f() missing 1 required positional argument: 'self'
# a.f()
因为函数 f未绑定(bind)到对象 a .
这就是为什么当调用 a.f() 时它将引发有关缺少参数的错误(如果 f 已绑定(bind)到 a ,则该对象 a 是缺少的参数 self )。
这部分是文档引用的内容:

It is also important to note that user-defined functions which are attributes of a class instance are not converted to bound methods.


当然,如果函数 f,这一切都不会发生。已在类 A 中定义,这就是文档中的以下部分所述:

...this only happens when the function is an attribute of the class.


将用户定义的方法设置为类的属性,正确的方法
添加功能 f反对 a你应该使用:
import types

class A:
pass

def f(self):
print("I\'m in user-defined function")

a = A()

a.f = types.MethodType( f, a )

# <bound method f of <__main__.A object at 0x000001EDE4768E20>>
print(a.f)

# Works! I'm in user-defined function
a.f()
哪个限制了用户定义的方法 f实例 a .

关于python - 为什么绑定(bind)类实例方法与绑定(bind)类方法不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63665702/

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