詳談Python中self的作用


其實有些小伙伴會問我,面試中遇到面試官會問到self的作用是什么?(當然,年輕時的我也被問過)

那么現在來給大家講一下Python中self的作用。

敲過代碼的都知道

我們C#或者是一些C、C++甚至是一些,通常會new一個新的對象,然后有時候會用this來引用這個對象的自身(沒接觸過C的當我沒講過)

而我們來看看self本身的意思是什么?

self

翻譯過來通常代表着自己、自身的意思。

顧名思義,在Python中self也是代表自身自己的意思,那它代表是什么自己呢?

用過PyCharm的小伙伴可能會知道,我們在定義一個函數的時候並沒有出現self的相關。

但是我們定義了一個類的時候,類的函數,都會默認第一個的參數就是self。

是的,所謂的self,可以理解為自己
可以把self當做C++中類里面的this指針一樣理解,就是對象自身的意思
某個對象調用其方法時,python解釋器會把這個對象作為第一個參數傳遞給self,所以開發者只需要傳遞后面的參數即可

在定義類的過程中,無論是顯式創建類的構造方法,還是向類中添加實例方法,都要求將 self 參數作為方法的第一個參數

class KnowTheSelf():

    def __init__(self):
        print("正在構建一個類")

    def Know(self):
        print("知道什么是self")

New = KnowTheSelf()
New.Know()

輸出結果:
正在構建一個類
知道什么是self


可以看到PyCharm在定義這個類的函數的時候,都會默認帶入一個參數,而這個參數,就是類的實例的自己

這種用法跟C++的this的用法如出一轍,只不過self是個約定俗成的名稱,在你沒有改變這個名稱之前,咱們約定好就叫這個,久而久之,有些人也懶得去改變,所以就一般以self來定義。

事實上,Python 只是規定,無論是構造方法還是實例方法,最少要包含一個參數,並沒有規定該參數的具體名稱。之所以將其命名為 self,只是程序員之間約定俗成的一種習慣,遵守這個約定,可以使我們編寫的代碼具有更好的可讀性(大家一看到 self,就知道它的作用)。

那么,self 參數的具體作用是什么呢?打個比方,如果把類比作造房子的圖紙,那么類實例化后的對象是真正可以住的房子。根據一張圖紙(類),我們可以設計出成千上萬的房子(類對象),每個房子長相都是類似的(都有相同的類變量和類方法),但它們都有各自的主人,那么如何對它們進行區分呢?

當然是通過 self 參數,它就相當於每個房子的門鑰匙,可以保證每個房子的主人僅能進入自己的房子(每個類對象只能調用自己的類變量和類方法)。

如果你接觸過其他面向對象的編程語言(例如 C++),其實 Python 類方法中的 self 參數就相當於 C++ 中的 this 指針。

也就是說,同一個類可以產生多個對象,當某個對象調用類方法時,該對象會把自身的引用作為第一個參數自動傳給該方法,換句話說,Python 會自動綁定類方法的第一個參數指向調用該方法的對象。如此,Python解釋器就能知道到底要操作哪個對象的方法了。

因此,程序在調用實例方法和構造方法時,不需要手動為第一個參數傳值。

class KnowTheSelf():

    def __init__(self):
        print("正在構建一個類")

    def Know(self):
        print(self,"知道什么是self")


New = KnowTheSelf()
New.Know()

上面代碼中,Know() 中的 self 代表該方法的調用者,即誰調用該方法,那么 self 就代表誰。因此,該程序的運行結果為

正在構建一個類
<__main__.KnowTheSelf object at 0x000001DDA4523978> 知道什么是self

另外,對於構造函數中的 self 參數,其代表的是當前正在初始化的類對象。看看下面的例子

class KnowTheSelf():
    def __init__(self, name):
        self.name = name



New = KnowTheSelf("張三")
print(New.name)

輸出結果:
張三

可以看到,KnowTheSelf在初始化的時候,調用的構造函數中 self 代表的是 張三

顯然,無論采用哪種方法,self 所表示的都是實際調用該方法的對象。

總之,無論是類中的構造函數還是普通的類方法,實際調用它們的誰,則第一個參數 self 就代表誰。


免責聲明!

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



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