详解python方法之绑定方法与非绑定方法


Posted in Python onAugust 17, 2020

写在之前

在 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 绑定方法与非绑定方法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python保存字符串到文件的方法
Jul 01 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
Python中类型检查的详细介绍
Feb 13 Python
对Python w和w+权限的区别详解
Jan 23 Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 Python
python如何查找列表中元素的位置
May 30 Python
如何利用python之wxpy模块玩转微信
Aug 17 #Python
深入了解Python 方法之类方法 &amp; 静态方法
Aug 17 #Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 #Python
python如何操作mysql
Aug 17 #Python
详解python 内存优化
Aug 17 #Python
浅谈如何使用python抓取网页中的动态数据实现
Aug 17 #Python
详解Python 中的容器 collections
Aug 17 #Python
You might like
论建造顺序的重要性
2020/03/04 星际争霸
10条PHP编程习惯助你找工作
2008/09/29 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
JavaScript中的跨浏览器事件操作的基本方法整理
2016/05/20 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
2017/06/04 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
React性能优化系列之减少props改变的实现方法
2019/01/17 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
Python并行分布式框架Celery详解
2018/10/15 Python
python和c语言的主要区别总结
2019/07/07 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
工作会议方案
2014/05/21 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
2014工程部年度工作总结
2014/12/17 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python