python-關於類、方法、對象(實例):通過一個例子看一下self都做了哪些事情


     我們在定義一個類時,經常會在類的各個方法中看到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM