看廖雪峰的python教程时候,看到它使用了MethodType函数,但是并没有教怎么使用,就在网上搜了一哈,记录一下
python 中MethodType函数使用方法:
使用的anaconda,创建的python 2.7的环境
公共部分
from types import MethodType #先导入MethodType
#创建类
class Student():
pass
def set_age(self,myage):
self.age = myage
t1 = Student()#创建实例
t2 = Student()
t3 = Student()
#t1.name = 'Fan'#可以给实例绑定属性
#print(t1.name)--->Fan
MethodType函数可以给实例对象或类绑定方法
MethodType(set_age,t1,Student)
第一个是实例要绑定的方法,第二个是实例,第三个是类名(可省略)
第一种方式:
'动态方式'
t1.set_age = MethodType(set_age,t1,Student)
t1.set_age(10)
t2.set_age = MethodType(set_age,t2,Student)
t2.set_age(11)
t3.set_age(12)
print(t1.age)--->10
print(t2.age)--->11
print(t3.age)--->出错,会提示Student类中没有属性set_age
因此绑定给不同的实例,每个实例有自己单独的指向区域,不同实例的调用互不影响。而且Student类的其他实例,没有绑定set_age方法,不能调用此方法
第二种:
'静态'
Student.set_age=MethodType(set_age,Student)
t1.set_age(10)
t2.set_age(11)
print (t1.age)--->11
print (t2.age)--->11
把set_age方法用MethodType()函数绑定到Student类上,Student类的不同实例都调用的同一个set_age方法,后面的值会覆盖前面的赋值。
要实现不同实例调用互不影响,可以将:
Student.set_age=MethodType(set_age,Student)
添加参数`None`,变为
Student.set_age=MethodType(set_age,None,Student)
至于为啥添加None,还不清楚:
在Py3版本时,MethodType()函数只能绑定两个参数了,为了给所有实例都绑定方法,可以给class绑定方法,而可以不用MethodType()函数:
Student.set_age=set_age