详解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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
Python制作词云的方法
Jan 03 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
Python chardet库识别编码原理解析
Feb 18 Python
Python使用graphviz画流程图过程解析
Mar 31 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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
PHP面向对象编程快速入门
2006/10/09 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
JavaScript设置FieldSet展开与收缩
2009/05/15 Javascript
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
2017/11/21 Javascript
Vue实现表格中对数据进行转换、处理的方法
2018/09/06 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
python word转pdf代码实例
2019/08/16 Python
python Manager 之dict KeyError问题的解决
2019/12/21 Python
python对execl 处理操作代码
2020/06/22 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
财务科科长岗位职责
2014/03/10 职场文书
主持词开场白
2014/03/17 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python