限制屬性綁定(__slots__)

正常狀況下,當定義了一個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__中
相關文章
相關標籤/搜索