self的意思是“自身”,python中代表類的實例,而非類。self只有在類的方法中才會有,獨立的函數或方法是不必帶有self的;self在定義類的方法時是必須有的。self名稱不是必須的,你可以定義成a或b或其它名字都可以,但是約定成俗,可減少理解難度。
首先我們要搞明白Python的類中爲要什麼要用到self這個單詞呢,爲什麼不用"zhangsan"、"lisi"這樣的名字呢,這肯定有他的用意。
self代表類的實例,而非類。
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
執行結果如下:
<main.Test object at 0x000000000284E080>
<class 'main.Test'>
從上面的例子中可以很明顯的看出,self代表的是類的實例。而self.class則指向類。
類中的方法第一個參數必須是 self ,不然實例無法正確調用類中的方法,也就是說,如果方法中第一個參數不是 self(廣義的),那麼這個方法是沒有任何價值的,因爲實例無法調用它,一個無法被調用的方法真不知道有什麼用。
注意:把self換成this,結果也一樣,但Python中最好用約定俗成的self。
在繼承時,傳入的是哪個實例,就是那個傳入的實例,而不是指定義了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()方法,所以就會成功調用