首頁  >  文章  >  後端開發  >  python中的self多餘嗎

python中的self多餘嗎

anonymity
anonymity原創
2019-06-14 16:18:572410瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn