python 動態繫結方法 MethodType()
阿新 • • 發佈:2019-01-25
動態繫結方法 MethodType()
在動態語言中,有一種方法可以使類或者例項在沒有方法或者沒有想要的方法時,動態的加上一個方法。使用的就是 MethodType()
其使用方法是:
form types import MethodType
需要繫結的類或例項.需要被繫結的方法=MethodType(方法名,類名/屬性名)
1.繫結方法到例項中
class Student (object): #先建立一個類
pass
def set_age(self,age): #一個即將被繫結的方法
self.age=age
s=Student() #建立一個例項
from types import MethodType
s.set_age=MethodType(set_age,s) #動態繫結方法:set_age到s
s.set_age=22 #使用動態繫結的方法
print(s.set_age) #輸出22
s.set_age=MethodType(set_age,s)
s.set_age(23)
print(s.age) #輸出23
2.繫結到類上
class Student (object): #先建立一個類
pass
def set_age(self,age): #一個即將被繫結的方法
self.age=age
from types import MethodType
Student.set_age=MethodType(set_age,Student)
Student.set_age=22
print(Student.set_age) #輸出22
Student.set_age=MethodType(set_age,Student)
Student.set_age(23)
print(Student.age) #輸出23
s1=Student()
s1.age #輸出23
限制方法:__slots__
class Student(object):
__slots__ = ('name', 'age') # 用tuple定義允許繫結的屬性名稱
>>> s = Student() # 建立新的例項
>>> s.name = 'Michael' # 繫結屬性'name'
>>> s.age = 25 # 繫結屬性'age'
>>> s.score = 99 # 繫結屬性'score'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
由於'score'
沒有被放到__slots__
中,所以不能繫結score
屬性,試圖繫結score
將得到AttributeError
的錯誤。
使用__slots__
要注意,__slots__
定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的:
>>> class GraduateStudent(Student):
... pass
...
>>> g = GraduateStudent()
>>> g.score = 9999
除非在子類中也定義__slots__
,這樣,子類例項允許定義的屬性就是自身的__slots__
加上父類的__slots__
。
部分例子參考廖雪峰Python教程:連結: