python中MethodType的使用解析
MethodType:
用MethodType将方法绑定到类,并不是将这个方法直接写到类内部,而是在内存中创建一个link指向外部的方法,在创建实例的时候这个link也会被复制。
情况一:把方法绑定到某个类的实例上
class Student(object): pass def set_name(self, name): self.name = name s1 = Student() s2 = Student() s3 = Student() from types import MethodType #将set_name方法绑定到s1实例上 s1.set_name = MethodType(set_name, s1) s2.set_name = MethodType(set_name, s2) s1.set_name('tom') s2.set_name('tony') print(s1.name, ',', s2.name)
结果:
tom , tony
>>> print s3.name
Traceback (most recent call last): File "<pyshell#23>", line 1, in <module> print s3.name AttributeError: 'Student' object has no attribute 'name'
解析:MethodType把方法绑定在类实例上时,每个实例有自己单独的指向区域,互不干扰。
情况二:将方法绑定在类上
class Student(object): pass def set_name(self, name): self.name = name s1 = Student() s2 = Student() s3 = Student() from types import MethodType #将set_name方法绑定到s1实例上 Student.set_name = MethodType(set_name,Student) s1.set_name('tom') s2.set_name('tony') print(s1.name, ',', s2.name)
结果:
tony , tony
解析:MethodType把方法绑定在类上并且没有第二个None参数时,通过该类创建的实例都会指向相同的区域,导致后面实例的值会覆盖前面实例的值。
解析
Student类本身并没有属性和方法,所以用这个类创建的实例也没有属性和方法。用MethodType将set_age方法绑定到Student类,并不是将这个方法直接写到Student类内部,而是在Student内存中创建一个link指向外部的方法,在创建Student实例的时候这个link也会被复制。所以不管创建多少实例,这些实例和Student类都指向同一个set_name方法。s1.set_name('tom')并没有在S1这个实例内部创建name属性,而是将name属性创建在外部set_name方法的内存区中。因为s1和s1内部link都指向外部set_name方法的内存区,所以不管s1还是s1在调用set_name方法的时候改变的是set_name方法内存区里的name属性,所以s2改了s1也就改了,如果新建一个实例C在没有调用set_name方法的前提下也会有name属性,因为C的link指向的set_name方法的内存区,而set_name之前被A或者B调用过了。
总结
大概意思就是通过这样绑定的方法设置的属性有点java中静态变量的意思