Python self參數(shù)詳細(xì)介紹
在定義類的過(guò)程中,無(wú)論是顯式創(chuàng)建類的構(gòu)造方法,還是向類中添加實(shí)例方法,都要求將 self 參數(shù)作為方法的第一個(gè)參數(shù)。例如,定義一個(gè) Person 類:
class Person: def__init__(self): print("正在執(zhí)行構(gòu)造方法") # 定義一個(gè)study()實(shí)例方法 defstudy(self,name): print(name,"正在學(xué)Python")
那么,self 到底扮演著什么樣的角色呢?本節(jié)就對(duì) self 參數(shù)做詳細(xì)的介紹。
事實(shí)上,Python 只是規(guī)定,無(wú)論是構(gòu)造方法還是實(shí)例方法,最少要包含一個(gè)參數(shù),并沒(méi)有規(guī)定該參數(shù)的具體名稱。之所以將其命名為 self,只是程序員之間約定俗成的一種習(xí)慣,遵守這個(gè)約定,可以使我們編寫的代碼具有更好的可讀性(大家一看到 self,就知道它的作用)。
那么,self 參數(shù)的具體作用是什么呢?打個(gè)比方,如果把類比作造房子的圖紙,那么類實(shí)例化后的對(duì)象是真正可以住的房子。根據(jù)一張圖紙(類),我們可以設(shè)計(jì)出成千上萬(wàn)的房子(類對(duì)象),每個(gè)房子長(zhǎng)相都是類似的(都有相同的類變量和類方法),但它們都有各自的主人,那么如何對(duì)它們進(jìn)行區(qū)分呢?
當(dāng)然是通過(guò) self 參數(shù),它就相當(dāng)于每個(gè)房子的門鑰匙,可以保證每個(gè)房子的主人僅能進(jìn)入自己的房子(每個(gè)類對(duì)象只能調(diào)用自己的類變量和類方法)。
如果你接觸過(guò)其他面向?qū)ο蟮木幊陶Z(yǔ)言(例如 C++),其實(shí) Python 類方法中的 self 參數(shù)就相當(dāng)于 C++ 中的 this 指針。
也就是說(shuō),同一個(gè)類可以產(chǎn)生多個(gè)對(duì)象,當(dāng)某個(gè)對(duì)象調(diào)用類方法時(shí),該對(duì)象會(huì)把自身的引用作為第一個(gè)參數(shù)自動(dòng)傳給該方法,換句話說(shuō),Python 會(huì)自動(dòng)綁定類方法的第一個(gè)參數(shù)指向調(diào)用該方法的對(duì)象。如此,Python解釋器就能知道到底要操作哪個(gè)對(duì)象的方法了。
因此,程序在調(diào)用實(shí)例方法和構(gòu)造方法時(shí),不需要手動(dòng)為第一個(gè)參數(shù)傳值。例如,更改前面的 Person 類,如下所示:
class Person: def__init__(self): print("正在執(zhí)行構(gòu)造方法") # 定義一個(gè)study()實(shí)例方法 defstudy(self): print(self,"正在學(xué)Python") zhangsan =Person() zhangsan.study() lisi =Person() lisi.study()
上面代碼中,study() 中的 self 代表該方法的調(diào)用者,即誰(shuí)調(diào)用該方法,那么 self 就代表誰(shuí)。因此,該程序的運(yùn)行結(jié)果為:
正在執(zhí)行構(gòu)造方法
<__main__.Person object at 0x0000021ADD7D21D0> 正在學(xué)Python
正在執(zhí)行構(gòu)造方法
<__main__.Person object at 0x0000021ADD7D2E48> 正在學(xué)Python
另外,對(duì)于構(gòu)造函數(shù)中的 self 參數(shù),其代表的是當(dāng)前正在初始化的類對(duì)象。舉個(gè)例子:
class Person: name ="xxx" def__init__(self,name): self.name=name zhangsan =Person("zhangsan") print(zhangsan.name) lisi =Person("lisi") print(lisi.name)
運(yùn)行結(jié)果為:
zhangsan
lisi
可以看到,zhangsan 在進(jìn)行初始化時(shí),調(diào)用的構(gòu)造函數(shù)中 self 代表的是 zhangsan;而 lisi 在進(jìn)行初始化時(shí),調(diào)用的構(gòu)造函數(shù)中 self 代表的是 lisi。
值得一提的是,除了類對(duì)象可以直接調(diào)用類方法,還有一種函數(shù)調(diào)用的方式,例如:
class Person: defwho(self): print(self) zhangsan =Person() #第一種方式 zhangsan.who() #第二種方式 who = zhangsan.who who()#通過(guò) who 變量調(diào)用zhangsan對(duì)象中的 who() 方法
運(yùn)行結(jié)果為:
<__main__.Person object at 0x0000025C26F021D0>
<__main__.Person object at 0x0000025C26F021D0>
顯然,無(wú)論采用哪種方法,self 所表示的都是實(shí)際調(diào)用該方法的對(duì)象。
總之,無(wú)論是類中的構(gòu)造函數(shù)還是普通的類方法,實(shí)際調(diào)用它們的誰(shuí),則第一個(gè)參數(shù) self 就代表誰(shuí)。
到此這篇關(guān)于Python self參數(shù)詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Python self內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解python實(shí)現(xiàn)識(shí)別手寫MNIST數(shù)字集的程序
這篇文章主要介紹了詳解python實(shí)現(xiàn)識(shí)別手寫MNIST數(shù)字集的程序,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08python數(shù)字圖像處理之圖像自動(dòng)閾值分割示例
這篇文章主要為大家介紹了python數(shù)字圖像處理之圖像自動(dòng)閾值分割示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06利用Python+Selenium破解春秋航空網(wǎng)滑塊驗(yàn)證碼的實(shí)戰(zhàn)過(guò)程
本文給大家介紹使用Python+Selenium破解春秋航空網(wǎng)滑塊驗(yàn)證碼的實(shí)戰(zhàn)過(guò)程,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08PyTorch中tensor.backward()函數(shù)的詳細(xì)介紹及功能實(shí)現(xiàn)
backward()?函數(shù)是PyTorch框架中自動(dòng)求梯度功能的一部分,它負(fù)責(zé)執(zhí)行反向傳播算法以計(jì)算模型參數(shù)的梯度,這篇文章主要介紹了PyTorch中tensor.backward()函數(shù)的詳細(xì)介紹,需要的朋友可以參考下2024-02-02Python連接mysql數(shù)據(jù)庫(kù)的正確姿勢(shì)
這篇文章主要為大家詳細(xì)介紹了Python連接mysql數(shù)據(jù)庫(kù)的正確姿勢(shì),如何使用Python連接mysql數(shù)據(jù)庫(kù),本文為大家揭曉,感興趣的小伙伴們可以參考一下2016-02-02python實(shí)戰(zhàn)練習(xí)之最新男女顏值打分小系統(tǒng)
前幾天不是出過(guò)一期Python美顏相機(jī)嘛?不知道大家現(xiàn)在還記不記得?這一期的話題還是緊接著那一期顏值方面來(lái)走,對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下2021-09-09