1. 程式人生 > >Python中types.MethodType函式的用法詳解

Python中types.MethodType函式的用法詳解

看了網上好多的博文對這個函式的用法解釋都覺得少了些什麼,故自己寫這麼一篇博文來記錄一下我的上機操作結果及一些心得體會(操作環境:ubuntu 16.04/python2.7)

1.公共部分程式碼

#!/usr/bin/python2.7
from types import MethodType
#建立一個函式
def set_age(self, age):
 self.age=age
#建立一個類
class Student(object):
 pass

2.將set_age方法繫結到物件上

s1=Student()
s1.set_age=MethodType(set_age,s1,Student)#第一個引數是要繫結的方法,第二個引數是要繫結的物件,第三個引數是類名(可省略)
s1.set_age(23)
print s1.age
s2=Student()
s2.set_age(24)
print s2.age
執行結果:可以看到:s1的age屬性值正確輸出,而s2的age屬性值列印輸出出錯,那是因為
s1.set_age=MethodType(set_age,s1,Student)
只是將set_age函式繫結到了s1物件上,而沒有繫結到Student類上。

3.將set_age方法繫結到類上(沒有None引數)

Student.set_age=MethodType(set_age,Student)
s1=Student()
s2=Student()
s1.set_age(12)
s2.set_age(13)
print s1.age
print s2.age
執行結果:

可以看到,s2的age屬性值覆蓋了s1的age屬性值,這是因為

Student.set_age=MethodType(set_age,Student)
沒有None引數(但是為什麼沒有傳入None引數,就會產生這種結果,我找了很多文章也沒有找到,若有大佬能解釋一下,萬分感激)

4.將set_age方法繫結到類上(第二個引數為None)

Student.set_age=MethodType(set_age,None,Student)
s1=Student()
s2=Student()
s1.set_age(12)
s2.set_age(13)
print s1.age
print s2.age
執行結果:

可以看到,這次s2的age屬性值沒有覆蓋s1的age屬性值,這是因為

Student.set_age=MethodType(set_age,None,Student)

在第二個引數傳入了None引數,所以不會覆蓋。