python類中的self和變量用法及說明
在python的類中會(huì)使用到“self”,本文主要是談?wù)勵(lì)愔械膕elf和變量的關(guān)系。
先看示例代碼I。
class Test(object):
def __init__ (self, val1):
self.val0 = val1
def fun1(self):
print(self.val0)
def fun2(self, val2):
print(val2)
def fun3(self):
print(self.fun1)
self.fun1()
ins=Test(123)
ins.new_val=”I'm a new value”1、self是什么
在python的類中self代表實(shí)例本身,具體來說,是該實(shí)例的內(nèi)存地址。
在調(diào)用實(shí)例的方法時(shí),Python解釋器會(huì)自己把實(shí)例變量傳給類的函數(shù)中的self。
以上述代碼I為例
代碼I定義了一個(gè)類Test,在這個(gè)類中,self為參數(shù)變量,在類Test實(shí)例化得到實(shí)例ins時(shí),python解釋器自動(dòng)調(diào)用__init__,執(zhí)行Test.init(ins, 123),該self可接收實(shí)例ins的內(nèi)存地址,從而self代表了
實(shí)例本身。類似的,如果實(shí)例化ins后,執(zhí)行ins.fun1( ),python解釋器會(huì)將ins.fun1( )解釋成Test.fun1(ins)??梢姡瑂elf這個(gè)變量是無需用戶手動(dòng)傳送值的,解釋器會(huì)自動(dòng)幫我們給其傳遞實(shí)例。
需要注意的是,self不是關(guān)鍵字,換言之,可以用其它的合法變量名替換self,但是,規(guī)范和標(biāo)準(zhǔn)建議我們一致使用self。
2、self的使用場景
在類中,self的使用有下面3個(gè)場景
1)self為類中的函數(shù)的第一個(gè)參數(shù),例如在類中,def fun1(self, …)。
上文說過,“在調(diào)用實(shí)例的方法時(shí),Python解釋器會(huì)自己把實(shí)例變量傳給類的函數(shù)中的self”,如果類的函數(shù)的第一個(gè)參數(shù)不是代表實(shí)例的self,則調(diào)用實(shí)例的方法時(shí),該方法沒有參數(shù)接收解釋器自動(dòng)傳入的實(shí)例變量,從而程序會(huì)產(chǎn)生異常。
事實(shí)上,“和普通的函數(shù)相比,在類中定義的函數(shù)只有一點(diǎn)不同,就是第一個(gè)參數(shù)永遠(yuǎn)是實(shí)例變量self,并且,調(diào)用時(shí),不用傳遞該參數(shù)。除此之外,類的方法和普通函數(shù)沒有什么區(qū)別,所以,你仍然可以用默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù)”(廖雪峰老師說的)。
2)在類中,引用實(shí)例的屬性,示例:self.變量名(如self.val0)。
引用實(shí)例的屬性的目的是為實(shí)例綁定屬性、寫入或讀取實(shí)例的屬性。
例如,在代碼I中,在類的函數(shù)__init__中,“self.val1 = val1”將屬性val0綁定到了實(shí)例self(類實(shí)例化成ins后,self就代表實(shí)例ins了)上,并且將變量val1的值賦給了實(shí)例的屬性val0。
在函數(shù)fun1中,print(self.val0),讀取了實(shí)例self的值val0,并打印出來,當(dāng)然,在函數(shù)中修改屬性val0的值也是可以的。
3)在類中,調(diào)用實(shí)例的方法,例如,self.fun1();獲取實(shí)例的方法的地址,例如self.fun1。
類是抽象的模板,而實(shí)例是根據(jù)類創(chuàng)建出來的一個(gè)個(gè)具體的“對(duì)象”,每個(gè)對(duì)象都擁有相同的方法,但各自的數(shù)據(jù)可能不同。既然,self代表實(shí)例,則可以“self.函數(shù)名”的方式表示實(shí)例的方法地址,以“self.函數(shù)名()”的方式,調(diào)用實(shí)例的方法。在類的定義中,以及實(shí)例化后對(duì)實(shí)例方法的調(diào)用,都可以這樣做。
3、python的幾種變量——按作用域分
1、全局變量:在模塊內(nèi)、在所有函數(shù)外面、在class外面,這就是全局變量。
2、局部變量:在函數(shù)內(nèi)、在class的方法內(nèi)(未加self修飾的) ,這就是局部變量
3、靜態(tài)變量(也可以說,類屬性):在class內(nèi)的,但不在class的方法內(nèi)的,這就是靜態(tài)變量
4、實(shí)例變量(也可以說,實(shí)例屬性):在class的方法內(nèi)的,用self修飾的變量,這就是實(shí)例變量
注意,根據(jù)其他的分類方法可以得到其他的類別,例如私有變量。
4、self和變量的關(guān)系
綜合上述的1、2和3點(diǎn),可以得到在類中,self和變量的關(guān)系了,一言以蔽之,被self修飾的變量是實(shí)例變量,不被self修飾的變量不是實(shí)例變量。
實(shí)例變量有什么作用,或者說,什么時(shí)候應(yīng)該使用self修飾變量比較好?我的總結(jié)如下:
當(dāng)我們想將某個(gè)變量綁定給實(shí)例時(shí),就在類中,使用self修飾該變量。一般來說,類實(shí)例化為不同實(shí)例后,為了不同實(shí)例的某一變量互不干擾,就將該變量綁定給實(shí)例。
具體的使用場景
1)若需要在類的不同方法中調(diào)用同一變量,且屬于同一個(gè)類的不同實(shí)例的該變量互不影響(即排除類屬性),則在類中將該變量綁定給實(shí)例。
2)需要在類實(shí)例化得到實(shí)例后,修改、或引用實(shí)例的某變量,則在類中將該變量綁定給實(shí)例。
5、一點(diǎn)補(bǔ)充
為實(shí)例綁定屬性有兩種方式
1)在類的函數(shù)__init__中,為實(shí)例綁定變量。
這也是本文討論的場景。
根據(jù)pep8,所有的加了self的變量,需要確保是在__init__中首次出現(xiàn),雖然不這樣做有些場景下程序也不會(huì)出錯(cuò),但按照規(guī)定來吧。
2)在實(shí)例化后,為實(shí)例綁定新的屬性。例如,實(shí)例變量.屬性變量=值
由于Python是動(dòng)態(tài)語言,從而,根據(jù)類創(chuàng)建的實(shí)例可以任意綁定屬性。通過實(shí)例變量給實(shí)例綁定屬性是方法之一,例如代碼I中的,ins.newval=”I’m a new value”,為實(shí)例綁定了屬性newval。不過,這不是本文討論的關(guān)注點(diǎn)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python2.7 json 轉(zhuǎn)換日期的處理的示例
這篇文章主要介紹了python2.7 json 轉(zhuǎn)換日期的處理的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
Python 實(shí)現(xiàn)中值濾波、均值濾波的方法
今天小編就為大家分享一篇Python 實(shí)現(xiàn)中值濾波、均值濾波的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python實(shí)用庫 PrettyTable 學(xué)習(xí)筆記
這篇文章主要介紹了Python實(shí)用庫 PrettyTable 學(xué)習(xí)筆記,結(jié)合實(shí)例形式分析了Python表格操作庫PrettyTable的安裝、使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-08-08
Python中random模塊生成隨機(jī)數(shù)詳解
本文給大家匯總了一下在Python中random模塊中最常用的生成隨機(jī)數(shù)的方法,有需要的小伙伴可以參考下2016-03-03
Python樹莓派學(xué)習(xí)筆記之UDP傳輸視頻幀操作詳解
這篇文章主要介紹了Python樹莓派學(xué)習(xí)筆記之UDP傳輸視頻幀操作,結(jié)合實(shí)例形式詳細(xì)分析了Python樹莓派編程中使用UDP協(xié)議進(jìn)行視頻幀傳輸?shù)南嚓P(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-11-11
python 實(shí)現(xiàn)批量圖片識(shí)別并翻譯
這篇文章主要介紹了python 實(shí)現(xiàn)批量圖片識(shí)別并翻譯,幫助大家利用python處理圖片,感興趣的朋友可以了解下2020-11-11
自己搭建resnet18網(wǎng)絡(luò)并加載torchvision自帶權(quán)重的操作
這篇文章主要介紹了自己搭建resnet18網(wǎng)絡(luò)并加載torchvision自帶權(quán)重的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
python函數(shù)的默認(rèn)參數(shù)請(qǐng)勿定義可變類型詳解
這篇文章主要介紹了python函數(shù)的默認(rèn)參數(shù)請(qǐng)勿定義可變類型詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

