在Python開發中,我們常常需要在類中加上self或者pycharm工具在類中定義方法的時候就自動幫你加上了self,這是為啥呢?
起初我也不是特別明白,不停的查資料,后來想了想,這種解釋感覺也行得通,所以就想寫下來,難免以后會忘記;
self,網上標准化的解釋是表示類的實例,其實這個還是好理解的,只是后來又說了一大堆啥不是代表類,代表this,繼承的時候能不能寫等等,我就亂了,然后自己總結了一下;
總結如下:
1 因為Python是解釋性語言,而我們所說的Java和C都是編譯性語言,所以各語言的特點不一樣,所以也會有區別;首先來說一下和Java中this的區別,在我看來,self和this在用法是確實是一致的,都是表示這個類,但是有區別,舉個例子,在一個方法中,使用self和this是不一樣的,在Python方法中加入self,因為Python是解釋性語言,代碼是從上往下是一行行執行的,所以在執行的時候,這個方法並不知道它是屬於哪一個類的(換句話講是它只是類中的一個方法,但是它並不是知道它是屬於哪個類),所以加入self其實是告訴這個方法我是哪個類中的方法,所以要先用self,告訴這個方法,讓它知道它調用的是那一個類;而Java不一樣,對於編譯性語言來講,class類中不管是變量還是方法,全都是一次性打包完成的,所以就Java中的方法其實是知道它是屬於哪一個類的,這也是為啥在Java類中的方法不需要直接在第一個參數中寫this的原因;
代碼解釋:
class st(object): def __init__(self , name ,age): self.name = name self.age = age def na(self): print(self) print(self.age , self.name) def ag(): print('dsdsds') if __name__ == '__main__': t = st('caizhou' , 23) t.na() st.ag()
結果:
這里ag方法報錯了,但是能輸出結果,是不是很說明問題了?
Java就不寫了,感覺到這里也基本上證實了我的猜想了!這是第一點,也是最重要的一點;
2 至於說繼承,大概說一下吧,繼承的時候就是如果是子類調用父類的方法,只要是實例化了子類的對象,self統統都是實例化的子類的self,就算是調用父類的方法,self也是子類的實例化對象;
代碼解釋:
class Pa: def pprt(self): print(self) class Ch(Pa): def cprt(self): print(self) c = Ch() c.cprt() c.pprt() p = Pa() p.pprt()
應該寫的比較明白了,我感覺self的用途就這些了,只需要記住啥時候用self,啥時候不用就行了
結果:
到這里就講完了,以后想到啥了再補充,多指正,再見!!!!!