python 面向對象高級編程之使用__slots__

python學習筆記,特做記錄,分享給大家,希望對大家有所幫助。

使用__slots__

正常情況下,當我們定義了一個class,創建了一個class的實例後,我們可以給該實例綁定任何屬性和方法,這就是動態語言的靈活性。先定義class:

class Student(object):
    pass

然後,嘗試給實例綁定一個屬性:

s = Student()
s.name = 'Michael'
print s.name

運行結果:

Michael

Process finished with exit code 0

還可以嘗試給實例綁定一個方法:

def set_age(self, age): # 定義一個函數作爲實例方法
    self.age = age
from types import MethodType
s.set_age = MethodType(set_age, s) # 給實例綁定一個方法
s.set_age(25) # 調用實例方法
print s.age 

運行結果:

25

Process finished with exit code 0

但是,給一個實例綁定的方法,對另一個實例是不起作用的:

s2 = Student() # 創建新的實例
s2.set_age(25) # 嘗試調用方法

運行結果:

line 18, in <module>
    s2.set_age(25) # 嘗試調用方法
AttributeError: 'Student' object has no attribute 'set_age'

Process finished with exit code 1

爲了給所有實例都綁定方法,可以給class綁定方法:

def set_score(self, score):
    self.score = score
Student.set_score = set_score

給class綁定方法後,所有實例均可調用:

s.set_score(100)
print s.score

s2.set_score(99)
print s2.score

運行結果:

100
99

Process finished with exit code 1

通常情況下,上面的set_score方法可以直接定義在class中,但動態綁定允許我們在程序運行的過程中動態給class加上功能,這在靜態語言中很難實現。

使用__slots__

但是,如果我們想要限制實例的屬性怎麼辦?比如,只允許對Student實例添加name和age屬性。

爲了達到限制的目的,Python允許在定義class的時候,定義一個特殊的__slots__變量,來限制該class實例能添加的屬性:

class StudentOne(object):
    __slots__ = ('name', 'age') # 用tuple定義允許綁定的屬性名稱

然後,我們試試:

s = StudentOne() # 創建新的實例
s.name = 'Michael' # 綁定屬性'name'
s.age = 25 # 綁定屬性'age'
s.score = 99 # 綁定屬性'score'

運行結果:

line 35, in <module>
    s.score = 99 # 綁定屬性'score'
AttributeError: 'StudentOne' object has no attribute 'score'

Process finished with exit code 1

由於’score’沒有被放到__slots__中,所以不能綁定score屬性,試圖綁定score將得到AttributeError的錯誤。

使用__slots__要注意,__slots__定義的屬性僅對當前類實例起作用,對繼承的子類是不起作用的:

class GraduateStudent(StudentOne):
    pass
g = GraduateStudent()
g.score = 9999

除非在子類中也定義__slots__,這樣,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__。

歡迎關注公衆號**「網羅開發」**,回覆 「python」 可領取python測試demo和學習資源,大家一起學python,網羅天下方法,方便你我開發

希望可以幫助大家,如有問題可加QQ技術交流羣: 668562416
如果哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯繫我,經過授權方可轉載,謝謝


歡迎關注公衆號「網羅開發」

image

發佈了114 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章