當前位置:
首頁 > 最新 > Python 學習筆記之類與實例

Python 學習筆記之類與實例

共4613字,閱讀需要12分鐘

一 定義

類 (class) 封裝一組相關數據,使之成為一個整體,並使用一種方法持續展示和維護。這有點像把零件組裝成整車提供給用戶,無須了解汽車的內部結構和工作原理,只要知道方向盤,剎車和油門這些外部介面就可以正常行駛。類存在兩種關係1、繼承(inheritance,is-a)自某個族類繼承可以用來表達本車屬於某廠的哪個車族系列,除了繼承原車系的技術和優勢,還可基於某些環境進行改進。2、組合(composition,has-a)了哪些部件組合可用來表述該車使用了哪些零部件,比如最新的發動機。類與模塊的不同之處1、類可生成多個實例。2、類可被繼承和擴展。3、類實例的生命周期可控。4、類支持運算符,可按需重載。這些特性模塊沒有或者不需要,同時,模塊粒度大,模塊可用來提供遊戲場景級別的解決方案,而類則是該場景下的特定家族和演員。1.2、創建定義類,以此為個體為例。關鍵字 class 同樣是運行期指令,用於完成類型對象的創建。

可在函數內定義,以限制其作用範圍。類型與實例如果類在模塊中定義,那麼其生命周期與模塊等同,如果被放在函數內,那麼每次都是新建。即便名字和內容相同,也屬於不同類型。

函數內定義的類型對象,在所有實例死亡後,會被垃圾回收。類型對象除了用來創建實例,也為所有實例定義了基本操作介面,其負責管理整個家族的可共享數據和行為目標。實例只保存私有特徵,其以內部引用從所屬類型或其它所屬祖先類查找所需的方法,用來驅動展現個體面貌。

名字空間

類型有自己的名字空間,存儲當前類型定義的欄位和方法。這其中並不包括所繼承的祖先成員,其同樣以引用關聯祖先類型,無須複製到本地。

實例 instance o 會保存所有繼承層次的實例欄位,因為這些都屬於其私有數據。

當通過實例或類訪問某個成員時,會從當前對象開始(instance o 開始查找),依次由近到遠向祖先類查找(即 o --> class B --> class A 進行成員查找)。如此做的好處就是祖先類的新增功能可以直接 【廣播】給所有後代。在繼承層次的不同名字空間中允許有同名成員,並按順序優先命中。

二 欄位

依照所處空間不同,我們將欄位分為類型欄位實例欄位。官方將成員統稱為 Attribute,我們可按例將數據當做欄位。2.1、類型欄位【類型欄位】在 class 語句塊內直接定義,而實例欄位必須通過實例引用(self)賦值定義。僅從執行方式來看,無論實例方法存在於哪級類型,其隱式參數 self 總指向當前調用實例。

實例參數 self 只是約定成俗的名字,這類似於其它語言中的 this,換成 this 同樣有效。2.2、欄位賦值可使用賦值語句為類型實例添加的新欄位

可一旦實例重新賦值,就將會在其名字空間建立同名欄位,並會遮蔽原欄位。

2.3、私有欄位將私有欄位暴露給用戶是很危險的。因為無論是修改還是刪除都無法截獲,由此可能引發意外錯誤。因為語言沒有嚴格意義上的訪問許可權設置,所以只好將它們隱藏起來。如果成員名字以雙下劃線開頭,但沒有以雙下劃線結尾,那麼編譯器會自動對其重命名。

同時雙下劃線開頭課結尾的,通常是系統方法,比如 __ init __ ,__ hash __ ,__ main __等。所謂重命名,就是編譯器附加了類型名稱前綴。雖然這種做法不能真正阻止用戶訪問,但基於名字的約定也算一種提示。這種方式讓繼承類也無法訪問。重命名機制總是針對當前類型,繼承類型無法訪問重命名後的基類成員。可將雙下劃線前綴改為單下劃線,這樣雖然不能自動重命名,不過提示作用依舊。

三 屬性

對私有欄位會進行重命名保護,那公開欄位如何處理呢?

問題是核心在於訪問攔截,必須由內部邏輯決定如何返回結果。而屬性(property)機制就是將讀、寫和刪除操作映射到指定的方法調用上,從而實現操作控制。

這種 @ 語法被稱作裝飾器(decorator)。多個方法名必須相同,默認從讀方法尅是定義屬性,隨後以屬性名定義寫和刪除。如果實現只讀,或禁止刪除,則只需去掉對應的方法即可。

四、方法

方法是一種特殊函數,其與特定對象綁定,用來獲取或修改對象狀態。實際上,無論是對象構造,初始化,析構還是運算符,都以方法實現。根據綁定目標和調用方法的不同,方法可分為實例方法,類型方法,以及靜態方法。名字以上下劃線開始和結束的方法,通常有特殊用途,其由解釋器和內部機制調用。實例方法實例方法與實例對象綁定,在其參數列表中,將綁定對象作為第一參數,以便在方法中讀取或修改數據狀態。在以實例引用調用方法時,無須顯式傳入第一實參,而由解釋器自動完成。官方建議參數名用self,同樣以 cls 作為類型方法的第一參數名。

類型方法類型方法用來維護類型狀態,面向族群提供服務介面。除綁定的第一參數名稱不同外,還需添加專門的裝飾器,以便解釋器將其實例方法區分開來。

靜態方法靜態方法,則更像是普通函數。其既不接收實例引用,也不參與類型處理,所以就沒有自動傳入第一參數。使用靜態方法,更多原因是將類型作為一個作用域,或者當前類型添加便捷介面。

特殊方法下面又解釋器自動調用,與對象生命周期相關的方法。

__ new __:構造方法,創建對象實例

__ init __:初始化方法,設置實例的相關屬性

__ del __:析構方法,實例被回收時調用

創建實例時,會先調用

如果 __ new __ 返回實例與 cls 類型不符,將導致 __ init __ 無法執行。

五 總結

學習到此,我總算把類的創建,屬性和方法等弄清楚了,我最想強調一點,希望讀者把 實例 self 參數弄明白,後續編碼過程中使用較多。還要清楚實例方法和靜態方法的區別。下一節將詳細介紹類的繼承及重載。

PS:文章中有你沒掌握的嗎?留言告訴我!

END

如果覺得我的文章對你有幫助,請告訴我!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

如何用Python爬取LOL官網全英雄皮膚
站在時代的風口,要不要學習Python?

TAG:Python |