python 使用MethodType绑定方法到类

来源:互联网 发布:python 日志时间格式 编辑:程序博客网 时间:2024/05/21 06:47

问题引出

先看下面一段代码:
<span style="font-size:14px;">from types import MethodTypedef set_age(self,age):    self.age=ageclass Stu(object):    passStu.set_age=MethodType(set_age,Stu)A=Stu()B=Stu()A.set_age(10)B.set_age(15)print(A.age,B.age)#结果都是15</span>

运行这段代码我们会发现输出结果都是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中静态变量的意思
0 0