MethodType解析
前言
以下都是本人亲测,如有不妥之处,希望多多评论,以便改善,谢谢啦~
你是否有被MethodType、类和方法搞得一头雾水。不妨来看看我的测试,当然也可以看看官方文档,那里也更加正确!
常见的五种
先写出如下代码(示例):
from types import MethodType
class Student:
pass
A=Student()
B=Student()
def f(self, x):
self.x = x
1.前后都相同实例
代码如下(示例):
A.f = MethodType(f, A)
A.x=55
print(A.x)#55
A.f(44)
print(A.x)#44
print(B.x) #'Student' object has no attribute 'x'
print(Student.x) #type object 'Student' has no attribute 'x'
2.前后不同实例
代码如下(示例):
A.f = MethodType(f, B)
B.x=44
print(B.x) #44
A.f(55)
print(B.x) #55,可以看出A.f(55)== B.x=55
print(A.x) #error:'Student' object has no attribute 'x'
print(Student.x) #error:type object 'Student' has no attribute 'x'
3.前实例后类
代码如下(示例):
A.f = MethodType(f, Student)
A.f(55)
print(A.x,B.x,Student.x)#55 55 55
A.x=44
B.x=33
print(A.x,B.x,Student.x)#55 55 55
Student.x=22
print(Student.x) #22
print(A.f) #<bound method f of <class '__main__.Student'>>
#说明是Student类的方法,并不是创建了一个Student实例
4.前类后实例
代码如下(示例):
Student.f = MethodType(f, A)
A.f(55)
print(A.x)#55
# print(B.x,Student.x)# error:Student' object has no attribute 'x',表示不会对其他实例赋初值
B.f(44)
print(A.x)#44
Student.f(33)
print(A.x)#33
A.x=44
A.f(66)
print(A.x)#66,说明Student(66)== A.x(Student也可以换成其他实例)
B.x=22
Student.x=11
print(B.x,Student.x)#22 11
print(Student.f)#<bound method f of <__main__.Student object at 0x000001E1773340D0>>
#此处猜测:这样的结构,会使得该类的对象都获得方法,但不会赋初值
5.前类后类
代码如下(示例):
Student.f=MethodType(f,Student)
A.f(555)
print(A.x,B.x,Student.x)#555 555 555
B.f(2)
print(A.x,B.x,Student.x)#2 2 2
A.x=3
B.x=4
Student.x=5
print(A.x,B.x,Student.x)#3 4 5
Student.f(33)
print(A.x,B.x,Student.x)#3 4 33
#不难发现Student.f(33) == Student.x=33
总结
本文通过五个测试详细的展示并论证了MethodType的部分细节,但也有不太眼睛的地方,希望多多包涵~
以上就是今天要讲的内容,本文仅仅简单测试了MethodType,如有其他意见,希望一起讨论讨论!