第7 5節 揭開Python類中self的面紗

2021-09-24 09:27:22 字數 1238 閱讀 9788

在上節已經引入介紹了類定義,並簡單介紹了類變數、例項變數、類方法和例項方法,後面章節還會進一步詳細介紹相關的內容。本節要介紹的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(整合開發環境)也可以幫助你。

第8 2節 Python類的 init

前面 第8.1節 python類的構造方法 init 深入剖析 語法釋義 一節介紹了構造方法定義的語法,並進行了語法解釋說明,本節將通過案例來說明構造方法引數傳遞及返回值的情況。一 案例說明 本節定義乙個汽車類,它有四個例項變數 wheelcount,power,oilcostperkm,total...

第7 8節 Python中隱秘的類封裝方法

前面章節已經介紹了python中的多型和繼承,本節將介紹物件導向程式設計oop三大特徵的另乙個特徵 封裝。一 概念 封裝是將物件的狀態資訊 也就是資料 屬性 隱藏在物件內部,將物件的屬性和實現細節隱藏起來,不允許外部程式直接訪問物件內部資訊,而是通過類所提供的方法來實現對內部資訊的操作和訪問,讓方法...

第7 9節 案例詳解 Python類封裝

上節介紹了python中類的封裝機制,本節結合乙個具體例子進行詳細說明。我們定義乙個person類,其內部有姓名 年齡和型別三個例項變數,並定義了相關的訪問方法 class person def type self if self.age 16 return 青少年 elif self.age 60...