一、 引言

《第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. ubuntu下创建http服务器

    使用ubuntu搭建一个简单的http服务器安装apache21.sudo apt-get update2.sudo apt-get install apache2 安装成功后,再/etc/apach ...

  2. 【日拱一卒】链表——如何实现lru

    LRU Redis的内存淘汰机制好几种,如ttl.random.lru. lru(less recently used)即最近最少使用策略,表示在最近一段时间内最少被使用到的Redis键,如果遇到内存 ...

  3. 前端动画框架GSAP框架随笔

    gsap是目前非常流行的前端动画框架,可以非常轻松构造出复杂的动画效果,这里仅对我实际使用中的一些例子进行总结 官网 示例 文章种所使用代码的在线示例 基础用法 // 声明一个滚动控制器 let ct ...

  4. MyBatis——MyBatis开发流程

    创建项目(IDEA中) 在IDEA中创建 MyBatis项目,详细流程如下: 这里有一点需要注意,我们创建的是Maven项目,如果大家以前没有配置过Maven环境的话,在创建完项目之后,需要配置一下M ...

  5. tcp syn-synack-ack 服务端 接收 SYN tcp_v4_do_rcv分析

    rcv 分析: /* The socket must have it's spinlock held when we get * here, unless it is a TCP_LISTEN soc ...

  6. brctl 增加桥接网卡

    前言 之前有一篇介绍配置桥接网卡的,这个桥接网卡一般是手动做虚拟化的时候会用到,通过修改网卡的配置文件的方式会改变环境的原有的配置,而很多情况,我只是简单的用一下,并且尽量不要把网络搞断了,万一有问题 ...

  7. Linux系统学习07-Centos软件安装几种方法

    配置好Centos一些基础设置后,接下来就是学习平时使用最多的软件安装. windwos下软件安装非常简单,就是下载好安装包,然后双击就会自动安装. 而Centos里面安装软件的方式方法有区别,熟悉几 ...

  8. linux shell简单快捷方式与通配符(元字符)echo -e文本显示颜色

    1.shell常用快捷方式 ^R 搜索历史命令^D 退出^A 光标移动到命令行最前^E 光标移动到命令行最后^L 清屏^U 光标之前删除^K 光标之后删除^Y 撤销^S 锁屏^Q 解锁 2.多条命令执 ...

  9. Linux Shell操作 执行C代码显示当前路径

    在unix系统下一切皆文件,文件夹是文件的一种.设备也会对应到相应的文件类型. 基础知识: . 代表当前路径 ..代表上级目录(父目录) / 在路径的最前边的时候代表树根.在路径中间的时候只不过是路径 ...

  10. 一个提高GPU模糊算法的速度的方法

    一个提高GPU模糊算法的速度的方法 我们知道,模糊算法,比如高斯模糊是卷积算法的一种应用.计算图像中一个像素的模糊颜色值需要通过采样周围像素的颜色值来计算. 对于GPU应用,比如OpenGL,在sha ...