__slot__ 限制

unpredictable_X發表於2019-02-16

限制__slot__

上一篇有提到通過動態繫結:在類外部定義方法,然後動態地給類加上新的功能,使得類的例項都能呼叫外部方法。
但如果要限制例項的屬性,不允許動態地新增,該怎麼辦呢?

為了達到限制的目的,python允許在定義class的時候,定義一個特殊的 slots 變數,來限制該class例項動態新增屬性。
那使用__slot__的好處呢?

  • 防止使用者隨意動態增加例項屬性;
  • 節約記憶體,因為動態繫結時屬性儲存在__dict__中;
  • 更快的屬性訪問速度。

例如:只允許對Student例項新增 name 和 age 屬性。

>>> class Student(object):
...      __slots__ = (`name`,`age`)    # 使用tuple定義允許繫結的屬性名稱
>>> s = Student()                      # 建立新的例項
>>> s.name = `xlp`                     # 繫結屬性name
>>> s.age = 24                         # 繫結屬性age 
>>> s.score = 99                       # 繫結屬性score

# 但是score沒有放到__slots__中,所以不能繫結score屬性,報錯。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: `Student` object has no attribute `score`

!!!但是__slots__定義的屬性只對當前類的例項起作用,對繼承的子類是不起作用的。除非在子類中也定義__slots__
這樣子類例項允許定義的屬性就是自身的__slots__ + 父類的__slots__ 限定的屬性。
例如:

>>> class SStudent(Student):
...     __slots__ = `gender`
...
>>> g = SStudent()
>>> g.name = `xxx`
>>> g.score = 99                # 子類依舊可以動態繫結屬性
>>> g.gender = `Female`
>>> g.teacher = `Mrs. Wang`    # 不允許繫結咯~
Traceback (most recent call last):
 File "<input>", line 1, in <module>
AttributeError: `SStudent` object has no attribute `teacher`

子類SStudent除掉可以繫結name、age,還可以繫結定義在子類__slot__中的gender屬性。
但是teacher屬性沒有在__slot__限制中,故不能動態繫結,會報錯。


❤ thanks for watching, keep on updating…
點個贊再走吧

相關文章