Discuss / Python / 关于MethodType 2021/1/5:

关于MethodType 2021/1/5:

Topic source

HellPlay

#1 Created at ... [Delete] [Delete and Lock User]
from types import MethodType
class Student(object):
    pass
def set_age(self, age):
        self.age = age
s = Student()

第一种:利用MethodTypeStudent绑定set_age方法,Student及其实例都具有set_age方法:

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绑定set_age方法,然后直接调用Studentset_age

Student.set_age = set_age

Student.set_age(78)

输出报错:

TypeError: set_age() missing 1 required positional argument: 'age'

第三种:利用Student.set_age = set_age绑定set_age方法,调用实例sset_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绑定方法只有实例可以调用,自身不能调用!

LibinYoung

#2 Created at ... [Delete] [Delete and Lock User]

插眼

第一种是给Student绑定了方法;第二种是给Student类绑定属性,不是方法,调用不能省略self,你只传了一个参数,所以解释器认为age没有被传参,所以报错;第三种只给s绑定了方法

就好像一个类的实例实际上继承自类本身一样,因为类拥有的属性和方法类的实例都有,但是类的实例拥有同名方法却会覆盖原来的方法


  • 1

Reply