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