1. 程式人生 > 實用技巧 >python之__slots__用法

python之__slots__用法

一、背景

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__。