正常狀況下,當定義了一個class並建立實例後,能夠給該實例綁定任何屬性和方法,這就是動態語言的靈活性
屬性和方法是能夠直接定義在class中的,但動態綁定容許在程序運行的過程當中動態給class加上屬性和方法,這在靜態語言中很難實現
對於python這種動態語言,給一個實例綁定的屬性和方法,對另外一個實例是不起做用的
爲了給全部實例都綁定方法,能夠經過給class綁定屬性和方法的方式實現,就是定義類屬性和類方法
但若是全部對象均可隨意綁定,則會致使程序很混亂,所以須要對實例的綁定進行一些限制
爲了達到限制的目的,Python容許在定義class的時候,定義一個特殊的__slots__變量,用來限制該class實例能添加的屬性
python
使用示例spa
class Student(object): __slots__ = ('name', 'age') # 用tuple定義容許綁定的屬性名稱 s = Student() # 建立新的實例 s.name = 'Michael' # 綁定屬性'name' s.age = 25 # 綁定屬性'age' s.score = 99 # 報錯,要綁定的屬性'score'沒有被放到__slots__中,因此不能綁定score屬性,試圖綁定score將獲得AttributeError的錯誤
__slots__僅對當前類實例起做用,對繼承的子類是不起做用的code
class GraduateStudent(Student): pass g = GraduateStudent() g.score = 9999 #不報錯,子類沒有定義__slots__,所以不受影響
若是子類也須要進行限制,則在子類中也定義__slots__,這樣子類實例容許定義的屬性就是自身的__slots__加上父類的__slots__對象
class GraduateStudent01(Student): __slots__ = ('score') # 用tuple定義容許綁定的屬性名稱 g01 = GraduateStudent01() g01.name = 'Michael' # 綁定屬性'name',父類定義容許綁定該屬性 g01.age = 25 # 綁定屬性'age',父類定義容許綁定該屬性 g01.score = 99 # 綁定屬性'score',子類定義容許綁定該屬性 g01.city = 'DaLian' #報錯,要綁定的屬性'city'沒有被放到父類和子類的__slots__中