一、 引言

《第7.14节Python类中的实例方法解析》介绍了使用“实例对象名.方法名 = MethodType(函数, 对象)”将动态定义的方法与实例进行绑定

《第8.12节 Python类中使用__dict__定义实例变量和方法》介绍了使用

self.__dict__['drive'] = MethodType(fdrive,self)

将动态定义的方法与实例进行绑定

这些绑定了方法与实例对象的方法,通过“实例.方法”调用时就无需在第一个实参中手工传递self参数,与类体中直接定义的方法调用形式及处理机制相同。而上节介绍__setattr__定义实例方法却没有提供这样的介绍,实际上通过__setattr__一样也可以实现动态定义的实例方法与实例进行绑定。

二、 绑定语法

  1. 语法:实例.__setattr__(实例方法名,MethodType(绑定函数, 实例))
  2. 其中:

    1)“实例”就是类定义的实例对象;

    2)“实例方法名”就是需要动态定义的实例方法的名字;

    3)“绑定函数”就是实例方法真正实现的在类体外定义的函数。

三、 案例

  1. 案例说明

    本节案例就是上节案例的基础上增加了一个绑定动态增加的实例方法与实例对象的处理,具体例子情况如下:

    1)从types模块中导入MethodType方法;

    2)定义了函数fdrive,准备用于实例方法定义使用;

    3)定义Car类, 其构造方法中定义了power实例变量和 totaldistance实例变量,不过totaldistance是使用__setattr__方法定义的;

    4)类定义后定义了类的实例car,在类体外使用__setattr__方法将函数绑定到car的实例方法driver,绑定时使用了MethodType方法,这样调用时就无需象上节一样传递“实例”实参。而是Python自动添加“self”。
  2. 源代码
>>> from types import MethodType #导入MethodType方法
>>> def fdrive(self,distance):self.totaldistance += distance #定义一个函数,准备用于赋值给类的实例方法属性 >>> class Car():
def __init__(self, power):
self.power = power
self.__setattr__('totaldistance',0) >>> car = Car('汽油发动机')
>>> car.__setattr__('drive',MethodType(fdrive,car)) #定义实例方法drive并和实例绑定
>>> car.drive(100) #调用新绑定的实例方法,参数中没有传入实参car
>>> car.__dict__
{'power': '汽油发动机', 'totaldistance': 100, 'drive': <bound method fdrive of <__main__.Car object at 0x0000000003805898>>}
>>>
  1. 执行截屏



    上图中标记黄色部分就是与上节调用drive方法不同的地方。

    本节结合案例介绍了使用__setattr__方法定义实例方法并使用MethodType绑定该方法和实例对象的过程,其本质是与《第8.12节 Python类中使用__dict__定义实例变量和方法》的绑定是一样的。

    老猿Python,跟老猿学Python!

    博客地址:https://blog.csdn.net/LaoYuanPython


    请大家多多支持,点赞、评论和加关注!谢谢!

第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定的更多相关文章

  1. 第7.14节 Python类中的实例方法详析

    第7.14节 Python类中的实例方法详析 一.    实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1.    类体中定义实例方法 第一种方式很简单,就是在类体 ...

  2. 第8.30节 重写Python __setattr__方法实现属性修改捕获

    一. 引言 在<第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获>章节介绍了__getattribute__方法,可以通过重写该方法,截获所有通 ...

  3. Android零基础入门第29节:善用TableLayout表格布局,事半功倍

    原文:Android零基础入门第29节:善用TableLayout表格布局,事半功倍 前面学习了线性布局和相对布局,线性布局虽然方便,但如果遇到控件需要排列整齐的情况就很难达到要求,用相对布局又比较麻 ...

  4. 第7.12节 可共享的Python类变量

    第7.12节 可共享的Python类变量 一.    引言 在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都 ...

  5. 第8.28节 Python中使用__setattr__定义实例变量和实例方法

    一. 引言 根据前面章节介绍的内容,我们知道实例变量.实例方法的定义可以通过以下方法进行: 在类体中直接定义实例变量.实例方法: 在实例方法中定义实例变量.实例方法: 在类体外调用方使用赋值语句赋值定 ...

  6. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  7. Python(五)编程小实例

    Python(五)编程小实例 抓取网页信息,并生成txt文件内容! Python抓取网页技能--Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些 ...

  8. 编程入门python之定义函数【转】

    编程入门python之定义函数 零基础学编程by学哥 2017-02-06 10:51 今天讲python函数. 输入参数求三角形或圆形或长方形的面积 先输入1个参数:形状类型 1=三角形 2=圆形 ...

  9. python测试mysql写入性能完整实例

    这篇文章主要介绍了python测试mysql写入性能完整实例,具有一定借鉴价值,需要的朋友可以参考下 本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下. 测试环境: ...

随机推荐

  1. python风格代码荟萃

    今天总结一下在python中常用的一些风格代码,这些可能大家都会用,但有时可能也会忘记,在这里总结,工大家参考~~~ 先点赞在看,养成习惯~~~ 标题遍历一个范围内的数字 for i in xrang ...

  2. efcore 学习

    新开一个博客来写一下ef core的学习过程 这个博客内容会跟着官网走 具体可见官网https://docs.microsoft.com/zh-cn/ef/core/get-started/?tabs ...

  3. 针对DEV XtraReport中没有radiobuttonlist的替代方法

     private void PrintingSystem_EditingFieldChanged(object sender, DevExpress.XtraPrinting.EditingField ...

  4. BPMN开源工作流编辑器bpmn-js落地实践中文文档

    BPMN是一套标准的业务流程建模符号规范,bpmn-js是基于此规范实现的一套渲染工具包和web建模器,可以实现拖拽生成工作流程图,效果大概如下 最近刚好用到,研究之后写了系列文章,分享给有需要的小伙 ...

  5. fork 子进程,父进程对于变量的共享

    经过代码的练习发现: fork创建的子进程会完全复制父进程的代码包括变量,既复制fork之前创建的变量. 但是在创建子进程后,子进程与父进程对同一个变量的改变将相互不受影响,即使获取同一变量的地址是一 ...

  6. Centos7上一次War包的部署与运行

    Centos7上一次War包的部署与运行 前言 由于前段时间第一次部署一个小型的项目,时间一长所以有些步骤有时候时间一长就忘了,在此做个简单的记录 一.原始系统开发环境 操作系统:Windows10: ...

  7. 定位一个网络问题引起的ceph异常

    前言 有一个ceph环境出现了异常,状态就是恢复异常的慢,但是所有数据又都在走,只是非常的慢,本篇将记录探测出问题的过程,以便以后处理类似的问题有个思路 处理过程 问题的现象是恢复的很慢,但是除此以外 ...

  8. Python_教程_使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...

  9. Linux——CentOS 7 systemctl和防火墙firewalld命令

    一.防火墙的开启.关闭.禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:systemctl disable fire ...

  10. [LeetCode题解]92. 反转链表 II | 一次遍历 + 反转

    解题思路 将链表分为三部分:[0, m).[m, n].(n, L],其中 L 为链表长度. 第一步:使用虚拟头节点 dummy,用于将 head 也能参与操作: 第二步:找到第 m-1 节点(fir ...