在这段代码中:
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/