python绑定调用和非绑定调用

绑定调用和非绑定调用

在python中,绑定调用和非绑定调用其实是相对于实例来说的。抽象点说就是:在类实例化过程中,类的方法会绑定在实例之中,此时,这个实例会拥有这个类的具体属性和方法,这些属性和方法已经和这个实例合为一体,就算类消失了或者改变了,也不会影响到实例。看例子很容易知道:

In [1]: class A(object):
   ...:     def sayhello(self):
   ...:         print("hello")
   ...:

In [2]: a = A()

In [3]: a.sayhello()
hello

接着上面的代码,我们对类A进行修改,将类A的sayhello()方法删除:

In [5]: class A(object):
   ...:     pass
   ...:

In [6]: a.sayhello()
hello

看,实例a还能正常使用方法sayhello。所谓绑定,就是将类中的方法绑定到实例中。

知道了绑定调用时什么,非绑定调用就呼之欲出了:
调用没有绑定到具体实例中的方法就是非绑定调用。当类改变时,方法也随之消失,调用不了。看例子:

In [9]: class A(object):
   ...:     def Hello(self):
   ...:         print("Hello, nice to meet you...")
   ...:

In [10]: A.Hello(A())
Hello, nice to meet you...

In [11]: class A(object):
    ...:     pass
    ...:

In [12]: A.Hello(A())
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-ad9a8d78a351> in <module>()
----> 1 A.Hello(A())

AttributeError: type object 'A' has no attribute 'Hello'

代码很直白了。这里的疑问是,为什么在进行非绑定调用时要传经参数A()?其实,这又涉及到python中的method种类。我们看到,在类A中定义def Hello(self)中的self参数,这就意味这这是一个实例方法(instancemethod)。self是一个实例参数,要传递一个实例进去,所以我们将实例A()传进去。
而关于python中的各种method区别,看这里
我们换一种方式来定义类方法就会更直白:

In [13]: class A(object):
    ...:     def Hello():
    ...:         print("Hell0, nice to meet you...")
    ...:

In [14]: A.Hello()
Hell0, nice to meet you...

In [15]: class A(object):
    ...:     pass
    ...:

In [16]: A.Hello()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-16-d3af5ce93a22> in <module>()
----> 1 A.Hello()

AttributeError: type object 'A' has no attribute 'Hello'

结论

同一个方法,在不同情况下,可以被绑定调用非绑定调用


版权:保留所有权,转载请注明出处!


原文地址:https://www.cnblogs.com/busui/p/7271423.html