python利用MethodType绑定方法到类示例代码


Posted in Python onAugust 27, 2017

前言

本文主要给大家介绍了关于python用MethodType绑定方法到类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

对python中MethodType不熟悉的朋友们可以先看看这篇文章

问题引出

先看下面一段代码:

from types import MethodType 
def set_age(self,age): 
 self.age=age 
class Stu(object): 
 pass 
Stu.set_age=MethodType(set_age,Stu) 
A=Stu() 
B=Stu() 
A.set_age(10) 
B.set_age(15) 
print(A.age,B.age)#结果都是15

运行这段代码我们会发现输出结果都是15,我们明明分别设置了A和B对象的属性值,为什么,会这样呢?开始我也有一样的疑问,后来发现是对MethodType的理解不够,经过查证,得到如下解释。

解析

Stu类本身并没有属性和方法,所以用这个类创建的实例也没有属性和方法。用MethodType将set_age方法绑定到Stu类,并不是将这个方法直接写到Stu类内部,而是在Stu内存中创建一个link指向外部的方法,在创建Stu实例的时候这个link也会被复制。所以不管创建多少实例,这些实例和Stu类都指向同一个set_age方法。A.set_age(10)并没有在A这个实例内部创建age属性,而是将age属性创建在外部set_age方法的内存区中。因为A和B内部link都指向外部set_age方法的内存区,所以不管A还是B在调用set_age方法的时候改变的是set_age方法内存区里的age属性,所以A改了B也就改了,如果新建一个实例C在没有调用set_age方法的前提下也会有age属性,因为C的link指向的set_age方法的内存区,而set_age之前被A或者B调用过了。

总结

大概意思就是通过这样绑定的方法设置的属性有点java中静态变量的意思

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
使用Python从有道词典网页获取单词翻译
Jul 03 Python
python实现五子棋人机对战游戏
Mar 25 Python
详解Django配置优化方法
Nov 18 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
使用Tkinter制作信息提示框
Feb 18 Python
在Mac中PyCharm配置python Anaconda环境过程图解
Mar 11 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
Python图像识别+KNN求解数独的实现
Nov 13 Python
python分布式爬虫中消息队列知识点详解
Nov 26 Python
python 用递归实现通用爬虫解析器
Apr 16 Python
AI:如何训练机器学习的模型
Apr 16 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 #Python
python读取excel表格生成erlang数据
Aug 26 #Python
使用Python实现简单的服务器功能
Aug 25 #Python
详解Python实现多进程异步事件驱动引擎
Aug 25 #Python
python基础while循环及if判断的实例讲解
Aug 25 #Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 #Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 #Python
You might like
一个PHP模板,主要想体现一下思路
2006/12/25 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
Python实现对比不同字体中的同一字符的显示效果
2015/04/23 Python
python实现linux下使用xcopy的方法
2015/06/28 Python
python中对数据进行各种排序的方法
2019/07/02 Python
基于python操作ES实例详解
2019/11/16 Python
介绍一下write命令
2012/09/24 面试题
税务专业毕业生自荐信
2013/11/10 职场文书
乡党委干部党的群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android