from types import MethodType
# 使用MethodType()方法将函数绑定到实例或者是类上
class Student(object):
pass
def set_name(self, name):
self.name = name
# 1.将方法绑定到实例上
s1 = Student()
s2 = Student()
s3 = Student()
# 分别给s1和s2绑定此方法
s1.set_name = MethodType(set_name, s1)
s2.set_name = MethodType(set_name, s2)
s1.set_name('s1')
s2.set_name('s2')
print(s1.name) # s1
print(s2.name) # s2
# print(s3.name) # AttributeError: ‘Student’ object has no attribute 'name'
# 因为上面我是给实例绑定了set_name()方法,这种绑定的方法在实例之间不共享,同时通过绑定的
# 方法实现的比如说属性的改变在实例之间也是不共享的,因此,s3没有name属性
# 2.将方法绑定到类上
# 实际上,如果是通过MethodType()方法将set_name()方法绑定到类上面,这是对于调用set_name()
# 方法生成的name属性是类属性,也就是说,s1.set_name('s1'),那么Student类将拥有一个类属性
# name, 并且所有的实例都可以访问
s1 = Student()
s2 = Student()
s3 = Student()
Student.set_name = MethodType(set_name, Student)
s1.set_name('s1')
s2.set_name('s2')
print(s1.name) # s2
print(s2.name) # s2
print(s3.name) # s2
print(Student.name) # s2
# 修改Student类,让其本身具有一个set_name_self()方法,用来修改实例name属性
class Student(object):
def set_name_self(self, name): # 这里的self.name是实例属性
self.name = name
def set_name(self, name):
self.name = name
s1 = Student()
s2 = Student()
s3 = Student()
Student.set_name = MethodType(set_name, Student)
s1.set_name_self('s1_self')
s2.set_name('s2')
s2.set_name_self('s2_self')
print(s1.name) # s1_self
print(s2.name) # s2_self
print(s3.name) # s2
print(Student.name)
# 可以看出,使用s1.set_name_self()方法使得s1拥有实例name属性,不共享。s2.set_name()方法
# 使得Student类拥有类属性name, 从而让s3.name和Student.name的值变为s2, 由于之后再次调用
# s2.set_name_self()方法让s2实例拥有了实例变量name,从而覆盖了类变量name,使得s2.name的值
# 变成了s2_self