天天看點

第7.5節 揭開Python類中self的面紗

在上節已經引入介紹了類定義,并簡單介紹了類變量、執行個體變量、類方法和執行個體方法,後面章節還會進一步詳細介紹相關的内容。本節要介紹的self是與類變量、執行個體變量、類方法和執行個體方法具體定義實作強相關的。

一、什麼是self?

在Python中self實際上是指向類聲明的執行個體對象自身,如果要在執行個體方法中通路執行個體變量,必須在變量前加“self.”。顯然,self很有用,甚至必不可少。如果沒有它,所有的方法都無法通路對象本身的屬性。

二、    self的使用

1.    定義執行個體方法時,self必須是方法的第一個參數,這種類的方法定義中傳遞第一個參數為self的方法即使執行個體方法;

2.    self代表類的執行個體,而非類,而self.__class__則指向類, self在定義時不可以省略;

3.    在執行個體化方法調用時,程式不用将調用方的執行個體作為參數放到調用方法的實參裡,而是由Python自動進行處理,自動将執行個體對象傳遞給執行個體方法。以上節的Duck類作為例子,其三個方法定義時都有self作為參數,但在執行個體對象調用swim的代碼中卻無參數。;

4.    執行個體方法通路執行個體變量時,必須通過self通路,否則指派語句會被認為是給方法的局部變量指派,非指派語句會報變量沒有定義;

5.    類的執行個體變量可以通過“執行個體名.屬性”的在執行個體方法和類外面直接通路。

1)    有個例外,變量名如果是兩個下劃線開頭,則無法這樣直接通路。

2)    兩個下劃線開頭的變量,可以通過變量名前加一個下劃線+和類名的方式通路。例如如果在Duck類内定義了一個執行個體變量:”__weight”,實際通路時可以通過”執行個體名._Duck__weight”的變量名通路。但這種方式不是Python推薦的,老猿也不推薦;

3)    這種加兩個下劃線的變量類似于c++的私有變量,其通路應該通過執行個體方法通路,否則對于未知類實作方式的執行個體直接通路可能引發未知的錯誤;

6.    如果類的方法中沒有self參數,在類的方法定義和調用時均不傳類執行個體是可以的,這樣的方法就是類方法和靜态方法;

7.    “self”這個名字并不是Python強制的名字,隻是一種約定俗成,實際上你完全可以起個别的任意名字,如“this”、“me”、“aaa”等,實際上不同執行個體方法中這個名字都可以不一緻,如在構造函數中叫“self1”,在析構函數中叫“self2”,在其他執行個體方法叫不同的任意名稱都可以,但是Python都會作為對象自身處理,并能正确通路,但為了大家友善了解,還是建議大家叫self。使用一個标準的名稱有很多優點——你的程式讀者可以迅速識别它,如果使用self的話,還有些IDE(內建開發環境)也可以幫助你。

最後有個問題,Python中執行個體方法第一個參數是“self”,但它又是可以任意命名的,那怎麼知道第一個參數是不是執行個體方法要的self呢?或者說怎麼知道這個方法是不是執行個體方法呢?大家想一想,答案将在後面章節揭曉。

本節介紹了Python中類中神秘的self,有關内容涉及面較廣,但實際上了解之後也就比較簡單。