zoukankan      html  css  js  c++  java
  • 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'
    

    结论

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


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


  • 相关阅读:
    volatile 和 mutable 关键字
    字符串第一个只出现一次的字符
    学一下HDFS,很不错(大数据技术原理及应用)
    把数组排成最小的数
    求第K大的数字
    数组中超过一半的数字
    打印字符的任意排列
    实时推荐系统架构
    带有任意指向指针的链表进行复制
    surfaceflinger中各个layer的排序
  • 原文地址:https://www.cnblogs.com/busui/p/7271423.html
Copyright © 2011-2022 走看看