我們在定義一個類時,經常會在類的各個方法中看到self,那么在程序執行時self到底起了什么作用,什么時候要加self,這一點需要我們思考並好好理解。之前在學習時沒有想這么多,加之用pycharm寫代碼,很多地方都自動補全了,有些地方沒加self,會提示錯誤,然后補全,沒有想過這個過程,今天剛好整理一下。
1.先簡單說明一下self的含義
類的方法與普通的函數只有一個特別的區別 —— 它們必須有一個額外的第一個參數名稱,但是在調用這個方法的時候你不為這個參數賦值, Python 會提供這個值。這個特別的變量指對象本身,按照慣例它的名稱是 self。
--- 摘自《A Byte of Python3(中文版)》
在類方法中,按慣例第一個第一個參數通常都稱為self,這個參數給方法提供一個鈎子,從而返回調用的主體,也就是實例對象:因為類可以產生許多實例對象,所以需要這個參數來管理每個實例彼此不同的的數據。
--- 摘自《Python學習手冊第3版》
通過上面2段描述可以把self簡單理解為實例本身,一般對類進行實例化得到一個實例對象后,通過點記法來調用類中的方法,如下
Object.method(arg1, arg2)
等價於
Class.method(Object, arg1, arg2)
self就是指那個Object
2.實際應用
在上面的例子中,程序執行過程如下:
(1)首先得到一個實例r,(PS.對類進行實例化時是類名后是要加上括號的)
(2)然后通過r.run_main("POST", url, data)來執行程序
(3)其實相當於執行了:RunMethod.run_main(r, "POST", url, data ),也就是說實例本身也是一個參數,只過我們不需要傳入self,python已經幫我們處理了
再反觀代碼結構:
(1)為了達到能夠通過實例來調用類中方法的目的,每個方法都必須有一個self參數(這也是類方法和普通函數的區別)
(2)注意到在run_main()方法中我們是通過self來調用get_request()和post_request():self.post_request(url, data)
等價於 ==》 RunMethod.post_request(self, url, data ),
如果不通過self來調用get_request(),那么程序將不知道是要調用類里面定義的post_request(),結果就會報錯提示你的 post_request()沒定義
至於要不要在類里面的方法中加self,這就涉及到了靜態方法、類方法、類(實例)方法的區別了
2018-05-08 21:39:01