python之__slots__用法
阿新 • • 發佈:2020-08-23
一、背景
python是一個動態語言,可以支援我們在執行時動態的給類、物件新增屬性或者方法;但是如果我們想要限制可以新增的屬性或方法該怎麼辦呢?
二、__slots__
python允許在定義class的時候,定義一個特殊的__slots__變數,來限制該class能新增的屬性:
>>> 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__。