A.fun和A()有什么区别。有趣吗?

时间:2014-06-13 12:05:45

标签: python

class A(object):
    def fun(self):
        pass
ins_a = A.fun
ins_b = A().fun

我遇到了这段代码,我无法理解这两个对象之间的区别。

2 个答案:

答案 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