python中的self多餘嗎

anonymity
發布: 2019-06-14 16:18:57
原創
2349 人瀏覽過

self代表類別的實例,而非類別。

python中的self多餘嗎

先看一個範例:

class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
登入後複製

執行結果如下

<__main__.Test object at 0x000000000284E080> 
登入後複製

從上面的例子可以很明顯的看出,self代表的是類別的實例。而self.class則指向類別。

self可以不寫嗎

在Python的解釋器內部,當我們呼叫t.prt()時,實際上Python解釋成Test.prt(t ),也就是說把self替換成類別的實例。

把上面的t.prt()一行改寫一下,運行後的實際結果完全相同。

實際上已經部分說明了self在定義時不可以省略

class Test: def prt(): print(self) t = Test() t.prt()
登入後複製

運行時提醒錯誤如下:prt在定義時沒有參數,但是運行時強行傳了一個參數。

由於上面解釋過了t.prt()等同於Test.prt(t),所以程式提醒多傳了一個參數t。

Traceback (most recent call last): File "h.py", line 6, in  t.prt() TypeError: prt() takes 0 positional arguments but 1 was given
登入後複製

如果定義和呼叫時均不傳類別實例是可以的,就是類別方法。

class Test: def prt(): print(__class__) Test.prt()
登入後複製

運行結果如下

登入後複製

在繼承時,傳入的是哪個實例,就是那個傳入的實例,而不是指定義了self的類別的實例。

先看程式碼

class Parent: def pprt(self): print(self) class Child(Parent): def cprt(self): print(self) c = Child() c.cprt() c.pprt() p = Parent() p.pprt()
登入後複製

運行結果如下

<__main__.Child object at 0x0000000002A47080> <__main__.Child object at 0x0000000002A47080> <__main__.Parent object at 0x0000000002A47240>
登入後複製

#解釋:

運行c.cprt()時應該沒有理解問題,指的是Child類別的實例。

但是在執行c.pprt()時,等同於Child.pprt(c),所以self指的依然是Child類別的實例,由於self中沒有定義pprt()方法,

所以沿著繼承樹往上找,發現在父類別Parent中定義了pprt()方法,所以就會成功呼叫。

總結

self在定義時需要定義,但在呼叫時會自動傳入。

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

#self總是指調用時的類別的實例。

以上是python中的self多餘嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!