详解python方法之绑定方法与非绑定方法
写在之前
在Python的类里面除了属性之外,还有方法,当然也有文档和注释这类东西,但是这个只是人来看,计算机则不关心。我们之前说过,我们一般用实例调用方法,既然我们说了是一般,那么就说明还有其他调用方法的方式,今天我们就来说一下「绑定方法和非绑定方法」。
绑定方法和非绑定方法
在Python中除了特殊方法以外,类中的其他普通方法也是经常用到的,所以对于普通的方法也要进行研究,下面我们来看一个例子:
>>>classSample: ...deff(self): ...print('ffunctionisanormalmethod') ... >>>sam=Sample() >>>sam.f ffunctionisanormalmethod
从我们之前的学习中你知道,在类sample中,方法f()本质上是一个函数,只不过这个函数的第一个参数必须是self,当然了,为了区别我们在类中给它起了另外的一个名字「方法」。但是跟函数相比,在本质上没什么不同。
当创建了实例以后,我们在用实例调用这个方法的时候,因为Python解释器已经把实例作为第一个参数隐式的传给了该方法,所以self这个参数不需要显式的写出来,这个知识点我反复说了很多次,就是为了能让大家理解self是实例!
如果想要把实例显式的传给方法,可以用下面的方式:
>>>Sample.f(sam) ffunctionisanormalmethod
用上述方法能更好的证明前面的观点,即实例化以后,self和实例sam是相同的。一般情况下我们再类里面使用self,在类外面使用sam,二者各有分工。
那如果我们在用类调用方法的时候,不传实例会发生什么呢?
>>>Sample.f() Traceback(mostrecentcalllast): File"",line1,in TypeError:unboundmethodf()mustbecalledwithSampleinstanceasfirstargument(gotnothinginstead)
答案是会报错,我们仔细看一下是因为缺少了一个参数,它是一个实例,所以我们要传一个实例。
Python中的一切都是对象,所以类Sample的方法f()也是对象,具体点说是一个函数对象,那么我们可以像下面这样来获得该对象:
>>>Sample.f
当然我们也可以通过实例来获得对象:
>>>sam.f>
上面用实例来得到这个方法对象,在这里我们看到是「绑定方法」(boundmethod)。
下面就要逐渐接近“绑定方法”和“非绑定方法”的概念本质了。
在类Sample的属性中,有一个叫__dict__的属性方法,我们在前面的文章中也介绍过,我们接下来就用它来看一下类的内部信息:
>>>sample.__dict__['f']
从上面来看,可以近一步的说明f是一个函数对象。
接下来让我们学习一个新的知识叫做「描述器」,那么什么是描述器呢?在Python中有几个比较特殊的特殊方法,分别是__get__(),__set__()和__delete__(),稍微简单点来说,有这些特殊方法的对象就叫做「描述器」。
描述器在Python中使用广泛,如果你还记得我讲过的super,它是属性,实例方法,继承等使用super的背后实现机制。关于描述器的内容,在这做具体的说明,在这里提到它,纯粹是为了解决绑定方法和非绑定方法的问题。所以如果你有兴趣的话,可以自行Google。
我们在这里仅看一下__get__(),关于它的所谓的描述器协议如下:
des.__get__(self,obj,type=None)--->value
具体应用到上面的那个例子则是如下操作:
>>>sample.__dict__['f'].__get__(sam,sample)>
你可以发现上面显示的结果和sam.f是一样的。所以综上,我们可以认为:当通过类来获取方法的时候,得到的是非绑定方法对象;当通过实例来获取方法的时候,得到的是绑定方法对象。
写在之后
绑定方法和非绑定方法到这就结束了,类的方法可分为不少,除了绑定方法和非绑定方法以外,还有静态方法和类方法等,我会在接下来依次的进行介绍,敬请期待。
写出来的东西是我的,看进去的东西才是你的,希望你不要浪费自己的时间,要学有所得。如果你觉得文章对你有帮助的话,欢迎你点赞转发,谢谢支持。
Theend。
以上就是详解python方法之绑定方法与非绑定方法的详细内容,更多关于python绑定方法与非绑定方法的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。