gpt4 book ai didi

Python:为什么具有两个参数的未绑定(bind)方法的行为不同于类方法?

转载 作者:太空宇宙 更新时间:2023-11-03 15:18:19 24 4
gpt4 key购买 nike

在这段代码中:

def fa(a,b): 
print a
print b
print " fa called"

class A:
@classmethod
def fa(a,b):
print a
print b
print " A.fa called"
class B:
def __init__(s,a):
s.a = a

obj1 = B(A.fa)
obj1.a("xxxx")

obj2 = B(fa)
obj2.a("xxxx")

输出:

__main__.A
xxxx
A.fa called
Traceback (most recent call last):
File "test.py", line 20, in <module>
obj2.a("xxxx")
TypeError: fa() takes exactly 2 arguments (1 given)

为什么 free 方法“fa”没有接收到“self”作为第一个参数?绑定(bind)方法 A.fa 的行为符合预期。

最佳答案

绑定(bind)方法 A.fa 接收 A 作为第一个参数,因为它是 A 的类方法。无论您如何调用此函数,它始终会接收 A 作为第一个参数。

自由方法 fa 没有绑定(bind),所以它唯一接收的参数是传入的参数。无论你如何调用这个函数,它永远不会接收参数以外的参数传入的。

这种行为与 JavaScript 等语言不同,在 JavaScript 中方法的调用方式决定了上下文。在 Python 中,隐式参数传递(类似于 JavaScript 上下文)是在函数定义时确定的,并且绑定(bind)或缺少绑定(bind)将始终用于该函数,无论它如何被调用。

如果你想动态绑定(bind)一个自由方法,你可以使用 types.MethodType 来实现。 ,例如:

def fa(x):
print x

class B: pass

>>> obj1 = B()
>>> obj1.a = MethodType(fa, obj1)
>>> obj1.a() # obj1.a behaves like an instance method bound to obj1
<__main__.B instance at 0x7f0589baf170>
>>> obj1.a2 = MethodType(fa, B)
>>> obj1.a2() # obj1.a2 acts like a class method bound to B
__main__.B

关于Python:为什么具有两个参数的未绑定(bind)方法的行为不同于类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19058955/

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