1. 程式人生 > >python 動態繫結方法 MethodType()

python 動態繫結方法 MethodType()

動態繫結方法 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教程:連結: