聊聊Python裡面的Self,是誰?

王林
發布: 2023-05-15 08:01:05
轉載
919 人瀏覽過

聊聊Python裡面的Self,是誰?

大家學Python物件導向的時候,總是會遇到一個讓人難以理解的存在:self。

這個self到底是誰啊,為什麼每個類別實例方法都有一個參數self,它到底有什麼作用呢?

「先下結論:類別實例化後,self即代表實例(物件)本身。」

想要理解self有個最簡單的方法,就是你把self當作「實例(物件)的身分證。」

Python的類別不能直接使用,只有透過建立實例(物件)才能發揮它的功能,每個實例(物件)都是獨一無二的,它可以呼叫類別的方法、屬性。類別就像靈魂附體一樣,讓實例(物件)有了自己(self)的功能。

聊聊Python裡面的Self,是誰?

初學者會發現,類別的方法(建構方法和實例方法)中都會有一個固定參數self,其實這個參數就是代表著實例(物件)本身,就像是身分證,實例可以憑著身分證去呼叫類別方法。

聊聊Python裡面的Self,是誰?

類比人類,人類就是一個Python類,每個個體的人代表著實例(對象),而每個人的身分證代表的Python中self,每個人可以用身分證去上大學、坐高鐵、住在飯店...(方法),而Python中的實例(物件)也可以憑著self去呼叫類別的方法。

聊聊Python裡面的Self,是誰?

上面是用類比的方法解釋了下self的意義,說到底self就是代表著實例本身,「當某個實例(物件)呼叫類別方法時,該物件會把自身的引用作為第一個參數自動傳給該方法,而這第一個參數就是self。」

而且self只是約定俗成的寫法,你可以用任何其他名稱代替self,不會改變程式碼意義,只不過我們一般不會這麼做。

為了更好的說明self的作用,我們來舉個例子,下面有一個Students類別:

class Students:
# 构造方法
def __init__(self,name):
self.name = name
# 实例方法
def study(self,examination_results):
self.examination_results = examination_results
print("同学{}的考试分数是{}".format(self.name,self.examination_results))
print("该实例对象的地址是{}".format(self))
登入後複製

先來個實例student_a。

studend_a = Students('studend_a')
print(studend_a.name)
登入後複製

結果列印出:studend_a。

再來個實例student_b。

studend_b = Students('studend_b')
print(studend_b.name)
登入後複製

結果列印出:studend_b。

可以看出,實例(物件)不一樣,列印出來的結果也不一樣,當類別被實例化後,self.name其實等於實例(物件).name。

還是以剛剛的程式碼為例,我們再來呼叫裡面的實例方法,裡面會印出self,就能看得更加明顯了。

實例student_a:

studend_a = Students('studend_a')
print(studend_a.study(80))
登入後複製

輸出結果:

同學studend_a的考試分數是80 這個實例物件的位址是<「main」.Students object at 0x00000129EB0F6A90>。

實例student_b:

studend_b = Students('studend_b')
print(studend_b.study(80))
登入後複製

輸出結果:

同學studend_b的考試分數是80 這個實例物件的位址是<「main」.Students object at 0x00000129EB0F6B38>。

大家能清楚看到兩個實例印出的self是不一樣的,因為self代表著實例(物件)本身。

以實例student_b來說,列印self出現下面物件資訊。

<__main__.Students object at 0x00000129EB0F6B38>。

如果再印出 student_b,會出現同樣的結果。

print(student_b)
登入後複製

輸出:

<__main__.students object at>。

這時候是不是就清楚了,類別實例化後,self即代表著實例(物件)本身。

以上是聊聊Python裡面的Self,是誰?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!