python绑定内核_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)

in ()

----> 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)

in ()

----> 1 A.Hello()

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

结论

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值