第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定
一、 引言
在《第7.14节Python类中的实例方法解析》介绍了使用“实例对象名.方法名 = MethodType(函数, 对象)”将动态定义的方法与实例进行绑定
在《第8.12节 Python类中使用__dict__定义实例变量和方法》介绍了使用
self.__dict__['drive'] = MethodType(fdrive,self)
将动态定义的方法与实例进行绑定
这些绑定了方法与实例对象的方法,通过“实例.方法”调用时就无需在第一个实参中手工传递self参数,与类体中直接定义的方法调用形式及处理机制相同。而上节介绍__setattr__定义实例方法却没有提供这样的介绍,实际上通过__setattr__一样也可以实现动态定义的实例方法与实例进行绑定。
二、 绑定语法
- 语法:
实例.__setattr__(实例方法名,MethodType(绑定函数, 实例)) - 其中:
1)“实例”就是类定义的实例对象;
2)“实例方法名”就是需要动态定义的实例方法的名字;
3)“绑定函数”就是实例方法真正实现的在类体外定义的函数。
三、 案例
- 案例说明
本节案例就是上节案例的基础上增加了一个绑定动态增加的实例方法与实例对象的处理,具体例子情况如下:
1)从types模块中导入MethodType方法;
2)定义了函数fdrive,准备用于实例方法定义使用;
3)定义Car类, 其构造方法中定义了power实例变量和 totaldistance实例变量,不过totaldistance是使用__setattr__方法定义的;
4)类定义后定义了类的实例car,在类体外使用__setattr__方法将函数绑定到car的实例方法driver,绑定时使用了MethodType方法,这样调用时就无需象上节一样传递“实例”实参。而是Python自动添加“self”。 - 源代码
>>> 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>>}
>>>
- 执行截屏

上图中标记黄色部分就是与上节调用drive方法不同的地方。
本节结合案例介绍了使用__setattr__方法定义实例方法并使用MethodType绑定该方法和实例对象的过程,其本质是与《第8.12节 Python类中使用__dict__定义实例变量和方法》的绑定是一样的。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!
第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定的更多相关文章
- 第7.14节 Python类中的实例方法详析
第7.14节 Python类中的实例方法详析 一. 实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1. 类体中定义实例方法 第一种方式很简单,就是在类体 ...
- 第8.30节 重写Python __setattr__方法实现属性修改捕获
一. 引言 在<第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获>章节介绍了__getattribute__方法,可以通过重写该方法,截获所有通 ...
- Android零基础入门第29节:善用TableLayout表格布局,事半功倍
原文:Android零基础入门第29节:善用TableLayout表格布局,事半功倍 前面学习了线性布局和相对布局,线性布局虽然方便,但如果遇到控件需要排列整齐的情况就很难达到要求,用相对布局又比较麻 ...
- 第7.12节 可共享的Python类变量
第7.12节 可共享的Python类变量 一. 引言 在上节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都 ...
- 第8.28节 Python中使用__setattr__定义实例变量和实例方法
一. 引言 根据前面章节介绍的内容,我们知道实例变量.实例方法的定义可以通过以下方法进行: 在类体中直接定义实例变量.实例方法: 在实例方法中定义实例变量.实例方法: 在类体外调用方使用赋值语句赋值定 ...
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- Python(五)编程小实例
Python(五)编程小实例 抓取网页信息,并生成txt文件内容! Python抓取网页技能--Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些 ...
- 编程入门python之定义函数【转】
编程入门python之定义函数 零基础学编程by学哥 2017-02-06 10:51 今天讲python函数. 输入参数求三角形或圆形或长方形的面积 先输入1个参数:形状类型 1=三角形 2=圆形 ...
- python测试mysql写入性能完整实例
这篇文章主要介绍了python测试mysql写入性能完整实例,具有一定借鉴价值,需要的朋友可以参考下 本文主要研究的是python测试mysql写入性能,分享了一则完整代码,具体介绍如下. 测试环境: ...
随机推荐
- JavaSE基础语法学习-异常
异常 异常指程序运行中出现的不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常发生在程序运行期间,它影响了正常的程序执行流程. 比如说,你的代码少了一个分号,那么运行出来结果是提示是 ...
- 《我想进大厂》之Java基础夺命连环16问
说好了面试系列已经完结了,结果发现还是真香,嗯,以为我发现我的Java基础都没写,所以这个就算作续集了,续集第一篇请各位收好. 说说进程和线程的区别? 进程是程序的一次执行,是系统进行资源分配和调度的 ...
- Elasticsearch(6):文档查询
为方便后续查询演示,我们先创建一个索引.创建索引请求如下:
- 性能工具-CPU
- App与小程序对接
背景: 商品详情页,点击分享,分享到微信好友,点开链接App拉起小程序. 用户在小程序浏览完成,跳转至原App购买商品. 功能点: 实现APP与小程序互调. 前提: 已对接好友盟ShareSDK(需要 ...
- Linux内核剖析——操作系统的启动
一.总体功能 1.从通电到BIOS跳转 1.1 CPU在通电后,先进入实模式,设置CS=0XFFFF,IP = 0X0000(指向BIOS) 1.2 BIOS进行执行系统监测,并且在地址=0处初始化中 ...
- PHP代码审计入门(敏感函数回溯参数过程)
最近开始啃<代码审计企业级web代码安全架构>这本书,这一章内容看了2天很多内容都理解最主要的是对PHP不熟练所以现在理解了大概 然后进行实地环境搭建最主要的是源码百度真不好找 最后找到一 ...
- Oracle数据泵的导入和导出
前言 今天王子要分享的内容是关于Oracle的一个实战内容,Oracle的数据泵. 网上有很多关于此的内容,但很多都是复制粘贴别人的,导致很多小伙伴想要使用的时候不能直接上手,所以这篇文章一定能让你更 ...
- zabbix的搭建及操作(1)server-client架构
实验环境 Server端 Centos7:192.168.10.10 server.zabbix.com 可连外网 Agent 端 Centos7:192.168.10.20 ...
- Mac专用下载器Folx软件中有没有“下载速度控制”功能
Mac专用下载器Folx软件不仅下载速度快,功能多,而且也可以实现下载上传速度控制的功能.下面小编将在Mac系统平台上,使用Folx 5版本,向大家全面介绍下Folx这款下载软件的速度控制功能,其中包 ...