天天看點

封裝

封裝

封裝

面向對象程式設計有三大特征:封裝、繼承、多态,其中最重要的一個特征就是封裝。封裝指的就是把資料與功能都整合到一起。除此之外,針對封裝到對象或者類中的屬性,我們還可以嚴格控制對它們的通路,分兩步實作:隐藏與開放接口

python的class機制采用雙下劃線開頭的方式将屬性隐藏起來(設定成私有的),但其實這僅僅隻是一種變形操作,類中所有下劃線開頭的屬性都會在類定義階段、檢測文法時自動變成“_類名__屬性名”的形式:

這種變形需要注意的問題是:

将資料隐藏起來就限制了類外部對資料的直接操作,然後類内應該提供相應的接口來允許類外部間接地操作資料,接口之上可以附加額外的邏輯來對資料的操作進行嚴格地控制

目的的是為了隔離複雜度,例如atm程式的取款功能,該功能有很多其他功能組成,比如插卡、身份認證、輸入金額、列印發票、取錢等,而對使用者來說,隻需要開發取款這個功能接口即可,其餘功能我們都可以隐藏起來

總結隐藏屬性與開放接口,本質就是為了明确區分内外,類内部可以修改封裝内的東西而不影響外部調用者的代碼;而類外部隻需要拿到一個接口,隻要接口名、參數不變,則無論設計者如何改變内部實作代碼,使用者均無需改變代碼。這就提供一個良好的合作基礎,隻要接口這個基礎約定不變,則代碼的修改不足為慮。

python專門提供了一個裝飾器property,可以将類中的函數“僞裝成”對象的資料屬性,對象在通路該特殊屬性時會觸發功能的執行,然後将傳回值作為本次通路的結果,例如

使用property有效地保證了屬性通路的一緻性。另外property還提供設定和删除屬性的功能,如下