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
如果哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯繫我,經過授權方可轉載,謝謝
歡迎關注公衆號「網羅開發」