python中的self多餘嗎

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

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

python中的self多餘嗎

先看一個範例:

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

執行結果如下

<__main__.Test object at 0x000000000284E080>
<class &#39;__main__.Test&#39;>
登入後複製

從上面的例子可以很明顯的看出,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 <module>
  t.prt()
TypeError: prt() takes 0 positional arguments but 1 was given
登入後複製

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

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

運行結果如下

<class &#39;__main__.Test&#39;>
登入後複製

在繼承時,傳入的是哪個實例,就是那個傳入的實例,而不是指定義了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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板