写在之前
在 Python 的类里面除了属性之外,还有方法,当然也有文档和注释这类东西,但是这个只是人来看,计算机则不关心。我们之前说过,我们一般用实例调用方法,既然我们说了是一般,那么就说明还有其他调用方法的方式,今天我们就来说一下「绑定方法和非绑定方法」。
绑定方法和非绑定方法
在 Python 中除了特殊方法以外,类中的其他普通方法也是经常用到的,所以对于普通的方法也要进行研究,下面我们来看一个例子:
> class Sample: ... def f(self): ... print('f function is a normal method') ... > sam = Sample() > sam.f f function is a normal method
从我们之前的学习中你知道,在类 sample 中,方法 f() 本质上是一个函数,只不过这个函数的第一个参数必须是 self,当然了,为了区别我们在类中给它起了另外的一个名字「方法」。但是跟函数相比,在本质上没什么不同。
当创建了实例以后,我们在用实例调用这个方法的时候,因为 Python 解释器已经把实例作为第一个参数隐式的传给了该方法,所以 self 这个参数不需要显式的写出来,这个知识点我反复说了很多次,就是为了能让大家理解 self 是实例!
如果想要把实例显式的传给方法,可以用下面的方式:
> Sample.f(sam) f function is a normal method
用上述方法能更好的证明前面的观点,即实例化以后,self 和实例 sam 是相同的。一般情况下我们再类里面使用 self,在类外面使用 sam,二者各有分工。
那如果我们在用类调用方法的时候,不传实例会发生什么呢?
> Sample.f() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unbound method f() must be called with Sample instance as first argument (got nothing instead)
答案是会报错,我们仔细看一下是因为缺少了一个参数,它是一个实例,所以我们要传一个实例。
Python 中的一切都是对象,所以类 Sample 的方法 f() 也是对象,具体点说是一个函数对象,那么我们可以像下面这样来获得该对象:
> Sample.f <function Sample.f at 0x000000000244AB48>
当然我们也可以通过实例来获得对象:
> sam.f <bound method Sample.f of <__main__.sample instance at 0x000000000244AB48
上面用实例来得到这个方法对象,在这里我们看到是「绑定方法」(bound method)。
下面就要逐渐接近 “绑定方法” 和 “非绑定方法” 的概念本质了。
在类 Sample 的属性中,有一个叫 __dict__ 的属性方法,我们在前面的文章中也介绍过,我们接下来就用它来看一下类的内部信息:
> sample.__dict__['f'] <function f at 0x000000000250D828>
从上面来看,可以近一步的说明 f 是一个函数对象。
接下来让我们学习一个新的知识叫做「描述器」,那么什么是描述器呢?在 Python 中有几个比较特殊的特殊方法,分别是 __get__(),__set__() 和 __delete__(),稍微简单点来说,有这些特殊方法的对象就叫做「描述器」。
描述器在 Python 中使用广泛,如果你还记得我讲过的 super,它是属性,实例方法,继承等使用 super 的背后实现机制。关于描述器的内容,在这做具体的说明,在这里提到它,纯粹是为了解决绑定方法和非绑定方法的问题。所以如果你有兴趣的话,可以自行 Google。
我们在这里仅看一下 __get__() ,关于它的所谓的描述器协议如下:
des.__get__(self,obj,type=None) ---> value
具体应用到上面的那个例子则是如下操作:
> sample.__dict__['f'].__get__(sam,sample) <bound method sample.f of <__main__.sample instance at 0x000000000244AB48
你可以发现上面显示的结果和 sam.f 是一样的。所以综上,我们可以认为:当通过类来获取方法的时候,得到的是非绑定方法对象;当通过实例来获取方法的时候,得到的是绑定方法对象。
写在之后
绑定方法和非绑定方法到这就结束了,类的方法可分为不少,除了绑定方法和非绑定方法以外,还有静态方法和类方法等,我会在接下来依次的进行介绍,敬请期待。
写出来的东西是我的,看进去的东西才是你的,希望你不要浪费自己的时间,要学有所得。如果你觉得文章对你有帮助的话,欢迎你点赞转发,谢谢支持。
The end。
以上就是详解python方法之绑定方法与非绑定方法的详细内容,更多关于python 绑定方法与非绑定方法的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】