關於self

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()方法,所以就會成功調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章