以下基于Python3.7
公共部分
from types import MethodType
class Student(object):
pass
def set_name(self,name):
self.name = name
s = Student()
b = Student()
不同的绑定方法
# A —— 将方法绑定到类上
Student.set_name = MethodType(set_name,Student)
# B —— 将方法绑定到实例对象上
s.set_name = MethodType(set_name,s)
b.set_name = MethodType(set_name,b)
不同的输出结果
# 最后分别调用
s.set_name('ss')
b.set_name('bb')
print(s.name,b.name)
...
A —— 输出如下
bb bb
B —— 输出如下
ss bb
...
为什么A情况下b的set_name会覆盖s呢?
#增加print看一下self是什么
def set_name(self,name):
print(self==Student)
self.name = name
...
输出结果是True
...
由此得出,self就是MethodType方法中传入的第二个参数对象Student
s和b每次调用set_name方法的时候修改的都是Student的name属性,
因此当然会后者覆盖前者
而B方法中传入的第二个参数就是s和b实例自己,所以他们每次修改的都是属于自己的name属性</