八月,你好。好快,七月就過去了。
新的一月,加油干。
本文是學(xué)習(xí)廖雪峰老師的博客的筆記。
使用__slot__
引例:正常情況下,我們可以給實例綁定任何屬性和方法,這體現(xiàn)了動態(tài)語言的靈活性。但在給一個實例綁定方法后,但對于其他實例來說,這個方法,不起作用,所以這時我們給class綁定這個方法,以使所有方法都能調(diào)用。
通常情況下,set_score方法可以直接定義在class中,但動態(tài)綁定允許我們在程序運行的過程中動態(tài)給class加上功能,這在靜態(tài)語言中很難實現(xiàn)。
如果我們想限制實例的屬性,比如,只允許對Student實例添加name和age屬性
為了達到限制的目的,Python中允許在定義class的時候,定義一個特殊的__slots__變量,來限制該class實例能添加的屬性。

由于‘score’沒有被放到__slots__中,所以不能綁定score屬性,試圖綁定將得到一個AttributeError的錯誤。
注意:使用__slots__要注意,__slots__定義的屬性僅對當(dāng)前類實例起作用,對繼承的子類不起作用。除非在子類中也定義__slots__,這樣,子類允許定義的屬性就是自身的__slots__加上父類的__slots__。
使用@property(裝飾器)
引子:在綁定屬性時,如果把屬性直接暴露出來,雖然寫起來簡單,但沒辦法檢查數(shù)據(jù),還容易把成績隨便改。但成績都是有限制的,為了限制score的范圍,可以通過set_score()來獲取成績,在通過一個get_score()來獲取成績,這樣,就可以在set_score()方法里,就可以檢查參數(shù)。如下:

現(xiàn)在就不能隨意的設(shè)置score了。

python一向貫徹簡潔,上述方法有點復(fù)雜,所以這時我們使用裝飾器,裝飾器可以冬天給函數(shù)加上功能,所以這時就用@property裝飾器負(fù)責(zé)把一個方法變成屬性調(diào)用:

@property的實現(xiàn)比較復(fù)雜,把一個getter方法變成屬性,只需要加上@property就可以啦,此時,@property本身又創(chuàng)建了另一個裝飾器@score.setter,負(fù)責(zé)把一個setter方法變成屬性賦值,于是,我們就擁有一個可控的屬性操作。

此方法是通過getter和setter實現(xiàn)的。
還可以定義只讀屬性,比如只定義getter不定義setter方法就是一個只讀屬性:

上面的birth就是可讀寫屬性,而age就是一個只讀屬性,因為age可以根據(jù)birth和當(dāng)前時間計算出來。
@property廣泛應(yīng)用在類的定義中,可以讓調(diào)用者寫出剪短的代碼,同時保證對參數(shù)進行必要的檢查,這樣,程序運行時就減少了,出錯的可能性。
多重繼承
繼承是面向?qū)ο缶幊痰囊粋€重要方式,因為通過繼承,子類就可以擴展父類的功能。
但是如果一個子類要擁有好多父類的功能,該如何辦那,這時我們可以使用多重繼承,這種設(shè)計通常稱為Mixln。
Mixln的目的就是給一個類增加多個功能,這樣,在設(shè)計類的時候,我們優(yōu)先考慮通過多重繼承來組合多個Mixln的功能,而不是設(shè)計多層次的復(fù)雜的繼承關(guān)系,這樣我們不需要復(fù)雜而龐大的繼承連,只要選擇組合不同的類的功能,就可以快速構(gòu)造出所需的子類了。