加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-17 08:08:37 所属栏目:Python 来源:网络整理
导读:前言 本文主要给大家介绍了关于python用MethodType绑定方法到类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 对python中MethodType不熟悉的朋友们可以先看看这篇文章 问题引出 先看下面一段代码: from types import Method

前言

本文主要给大家介绍了关于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中静态变量的意思

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读