天天看點

python self

1. self代表類的執行個體,而非類

上面的例子,self 代表的是類的執行個體。而 self.class 則指向類。

2. self不必寫成self

學過其他語言的,覺得 self 怪怪的,想寫成 this,也是可以的。

改成 this,運作結果一樣。但最好還是尊重約定俗成的習慣。

3. self可以不寫嗎

在 python 中,當我們調用 t.prt() 時,實際上 python 解釋成 Test.prt(t),也就是說把 self 替換成類的執行個體。

運作時出錯,因為 prt 沒有參數,我們強行傳了一個參數,t.prt() 等同于Test.prt(t)。

當然,我們可以定義和調用時均不傳類的執行個體,這就是類方法。

4. 繼承時,傳入的是哪個執行個體,就是那個傳入執行個體,而不是指定義了self的類的執行個體

運作 c.cprt() 時,指的是 Child 類的執行個體。

但是在運作 c.pprt()時,等同于 Child.pprt(c),是以 self 指的依然是 Child 類的執行個體,由于 self 中沒有定義 pprt() 方法,是以沿着繼承樹往上找,發現父類 Parent 中定義了 pprt() 方法,是以就會調用。

5. 在描述符類中,self指的是描述符類的執行個體

為什麼在 Desc 類中定義的 self 不是應該調用它的執行個體 t 嗎?怎麼變成了 Desc 類的執行個體了?

注意:這裡調用的是 t.x,也就是說 Test 類的執行個體 t 的屬性 x,由于執行個體 t 中沒有定義屬性 x,是以找到類屬性 x,而該屬性是描述符屬性,為 Desc 類的執行個體而已,是以此處沒有頂用 Test 的任何方法。

如果直接通過類來調用屬性 x 也可以得到相同的結果。

下面是把 t.x 改為 Test.x 運作的結果。

題外話:由于很多時候描述符類中仍然需要知道調用該描述符的執行個體是誰,是以在描述符類中存在第二個參數 ins,用來表示調用它的類執行個體,是以 t.x 可以看到第三行中的運作結果中第二項 <_main_.Test object at 0x000002346022D308>。而采用 Test.x進行調用時,沒有執行個體,傳回None。

總結

self 在定義時需要定義,但是在調用時會自動傳入

self 的名字并不是規定死的,但最好還是按照約定使用 self

self 總是指調用時的類的執行個體。