Python学习 Day14 python中MethodType的使用解析

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中静态变量的意思

猜你喜欢

转载自www.cnblogs.com/paulzhang511/p/8964382.html
今日推荐