python 使用MethodType绑定方法到类

问题引出

先看下面一段代码:
[python] view plain copy
  1. from types import MethodType  
  2. def set_age(self,age):  
  3.     self.age=age  
  4. class Stu(object):  
  5.     pass  
  6. Stu.set_age=MethodType(set_age,Stu)  
  7. A=Stu()  
  8. B=Stu()  
  9. A.set_age(10)  
  10. B.set_age(15)  
  11. 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 收藏,1032 浏览
  • 石天 提出于 2016-12-11 19:22

相似问题