class A(object):
def fun(self):
pass
ins_a = A.fun
ins_b = A().fun
我遇到了这段代码,我无法理解这两个对象之间的区别。
答案 0 :(得分:2)
只需在交互式解释器中尝试以上代码:
>>> class A(object):
... def fun(self):
... pass
...
>>> ins_a = A.fun
>>> ins_b = A().fun
>>> ins_a
<unbound method A.fun>
>>> ins_b
<bound method A.fun of <__main__.A object at 0x7f694866a6d0>>
正如您所看到的,这是绑定/未绑定方法的问题。绑定方法是一种方法&#34;绑定&#34;到一个对象。您可以获得更详尽的解释in this SO answer。
答案 1 :(得分:1)
最大的区别是如果你试图调用这些方法:
如果我们添加print "hello world"
,则会更明显。
class A(object):
def fun(self):
print ("hello world")
ins_a = A.fun
ins_b = A().fun
现在尝试同时调用:
In [10]: ins_a()
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-52906495cc43> in <module>()
----> 1 ins_a()
TypeError: unbound method fun() must be called with A instance as first argument (got nothing instead)
In [11]: ins_b()
hello world
在python 3中,它们是不同的类型,因为未绑定的方法类型消失了:
In [2]: type(ins_a)
Out[2]: builtins.function
In [3]: type(ins_b)
Out[3]: builtins.method