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()
#将set_name方法绑定到s1实例上
s1.set_name = MethodType(set_name, s1, Student)
s2.set_name = MethodType(set_name, s2, Student)
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把方法绑定在类实例上时,每个实例有自己单独的指向区域,互不干扰。

情况二:
(1)将方法绑定在类上(有None参数)

class Student(object):
    pass

def set_name(self, name):
    self.name = name

#将方法绑定在类上(有None参数)
Student.set_name = MethodType(set_name,Student)
s1 = Student()
s2 = Student()
s3 = Student()
s1.set_name('tom')
s2.set_name('tony')
>>> print s1.name, ',', s2.name, ',', s3.name
tom , tony ,

Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    print s1.name, ',', s2.name, ',', s3.name
AttributeError: 'Student' object has no attribute 'name'

解析:MethodType把方法绑定在类上并且有第二个None参数时,这种情况下的表现和情况一类似,通过该类创建的实例会指向各自不同的区域,各个实例之间互不干扰。

(2)将方法绑定在类上(没有None参数)

class Student(object):
    pass

def set_name(self, name):
    self.name = name

#将方法绑定在类上(没有None参数)
Student.set_name = MethodType(set_name,Student)
s1 = Student()
s2 = Student()
s3 = Student()
s1.set_name('tom')
s2.set_name('tony')
>>> print s1.name, ',', s2.name, ',', s3.name
tony , tony , tony

解析:MethodType把方法绑定在类上并且没有第二个None参数时,通过该类创建的实例都会指向相同的区域,导致后面实例的值会覆盖前面实例的值。

这种情况下其实最好是能够看一下MethodType类实现的源代码,了解三个参数都是什么作用,这样能够更深刻的理解,但我暂时还没找到源代码,有机会看到再来补充一哈。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页