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

标签 python

在这段代码中:

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/

相关文章:

python - 为什么使用 pandas qcut 返回 ValueError : Bin edges must be unique?

python - 如何让unoconv在转换为pdf之前自动计算公式?

python - 解析时发生意外的EOF错误?

python - 谷歌助手 "No module named googles...."

python - Scrapy、Selenium、jQuery Dropdown 与具有样式 ="display: none;"的选择标记不一致的行为

使用for arange循环时的python数组索引

java - 连接 Java 和 Python Flask

python - 函数调用之外的星号

python - 使用django web应用程序将csv文件导入mysql数据库

python - 如何从 App Engine (Python) Datastore 中获取当月的记录?