from types import MethodType class Student(object): pass def set_age(self, age): self.age = age s = Student()
第一种:利用MethodType给Student绑定set_age方法,Student及其实例都具有set_age方法:
MethodType
Student
set_age
Student.set_age = MethodType(set_age, Student)
Student.set_age(78)
print(s.age)
print(Student.age)
s.set_age(8)
输出:
78
8
第二种:利用Student.set_age = set_age绑定set_age方法,然后直接调用Student的set_age:
Student.set_age = set_age
输出报错:
TypeError: set_age() missing 1 required positional argument: 'age'
第三种:利用Student.set_age = set_age绑定set_age方法,调用实例s的set_age:
s
正常输出:
AttributeError: type object 'Student' has no attribute 'age'
结论:MethodType是直接给class绑定方法,自身和实例都可调用,而直接给class绑定方法只有实例可以调用,自身不能调用!
class
插眼
第一种是给Student绑定了方法;第二种是给Student类绑定属性,不是方法,调用不能省略self,你只传了一个参数,所以解释器认为age没有被传参,所以报错;第三种只给s绑定了方法
就好像一个类的实例实际上继承自类本身一样,因为类拥有的属性和方法类的实例都有,但是类的实例拥有同名方法却会覆盖原来的方法
Sign in to make a reply
HellPlay
Student.set_age = MethodType(set_age, Student)
Student.set_age(78)
print(s.age)
print(Student.age)
s.set_age(8)
print(s.age)
print(Student.age)
输出:
78
78
8
8
Student.set_age = set_age
Student.set_age(78)
输出报错:
TypeError: set_age() missing 1 required positional argument: 'age'
Student.set_age = set_age
s.set_age(8)
print(s.age)
正常输出:
8
print(Student.age)
输出报错:
AttributeError: type object 'Student' has no attribute 'age'
结论:
MethodType
是直接给class
绑定方法,自身和实例都可调用,而直接给class
绑定方法只有实例可以调用,自身不能调用!