簡(jiǎn)單分析python的類變量、實(shí)例變量
1、類變量、實(shí)例變量概念
類變量:
類變量就是定義在類中,但是在函數(shù)體之外的變量。通常不使用self.變量名賦值的變量。類變量通常不作為類的實(shí)例變量的,類變量對(duì)于所有實(shí)例化的對(duì)象中是公用的。
實(shí)例變量:
實(shí)例變量是定義在方法中的變量,使用self綁定到實(shí)例上的變量,只是對(duì)當(dāng)前實(shí)例起作用。
2、訪問(wèn)
類變量
在類的內(nèi)部和外部類變量都可以直接使用className.類變量的形式訪問(wèn)。但是在類的內(nèi)部,也可以使用self.類變量來(lái)訪問(wèn),但是這個(gè)是用含義就不同了(后面使用代碼驗(yàn)證)。
實(shí)例變量
在類的內(nèi)部,實(shí)例變量self.實(shí)例變量的形式訪問(wèn);在類的外部使用對(duì)象名。實(shí)例變量的形式訪問(wèn)。實(shí)例變量是綁定到一個(gè)實(shí)例上的變量,它只是屬于這個(gè)綁定的實(shí)力。而區(qū)別類變量的就是類變量是所有的來(lái)自用一個(gè)類的實(shí)例所共享。我們看到這里會(huì)有這樣的疑問(wèn)!
如果說(shuō)類變量對(duì)所有來(lái)自這個(gè)類的所有實(shí)例所共享,那么假如我一個(gè)實(shí)例去改變了這個(gè)類變量(假設(shè)使用這樣的操作object.類變量 = value)的值,那么對(duì)于其他的實(shí)例是不是都是可見(jiàn)的?
答案是否定的,下面驗(yàn)證。
class A(object):
# 定義一個(gè)類變量,初值是10
class_var = 10
print id(class_var)
def foo(self):
print '在類中訪問(wèn)類變量:A.class_var=', A.class_var
print '在類中訪問(wèn)實(shí)例變量: self.class_var=', self, self.class_var
# 改變實(shí)例變量的值
self.class_var = 40
print '修改后訪問(wèn)類變量:A.class_var=', A.class_var
print '修改后訪問(wèn)實(shí)例變量 self.class_var=',self, self.class_var
# 這里的class_var和函數(shù)外面的class_var不是同一個(gè)東西,這是一個(gè)局部變量
class_var = 20
print id(class_var)
print 'class_var=', class_var
A.class_var = 15
print 'A.class_var=', A.class_var
print 'class_var=',class_var
print 'self.class_var=',self.class_var
obj1 = A()
obj2 = A()
obj3 = A()
obj1.foo()
print A.class_var
print obj1.class_var
print obj2.class_var
print obj3.class_var
Output:
49964144 在類中訪問(wèn)類變量:A.class_var= 10 在類中訪問(wèn)實(shí)例變量: self.class_var= <__main__.A object at 0x0000000002FD2390> 10 修改后訪問(wèn)類變量:A.class_var= 10 修改后訪問(wèn)實(shí)例變量 self.class_var= <__main__.A object at 0x0000000002FD2390> 40 49963904 class_var= 20 A.class_var= 15 class_var= 20 self.class_var= 40 15 40 15 15
從上面運(yùn)行的結(jié)果分析:當(dāng)使用self.class_var形式訪問(wèn)類變量的之后,如果修改self.class_var的值,可以發(fā)現(xiàn),類變量的值沒(méi)有變化;不放心我們?cè)谛薷念愖兞康闹?,發(fā)現(xiàn)self.class_var的值也沒(méi)有受到影響。
從最后打印obj2和obj3這兩個(gè)都來(lái)自于一個(gè)類的實(shí)例中的類變量都是和修改后的類變量一樣,表示他們是共享類變量的。
3、總結(jié)
1、類變量可以使用className.類變量和self.類變量?jī)煞N方式訪問(wèn)。
2、如果使用self.類變量的方式訪問(wèn)并重新賦值后,這個(gè)變量就會(huì)成為實(shí)例變量和self綁定,實(shí)際上就變成了一個(gè)實(shí)例變量,實(shí)例變量會(huì)屏蔽掉類變量的值。
3、類變量是共享的,最好使用類名的方式來(lái)訪問(wèn)類變量。
4、類變量通過(guò)sel訪問(wèn)時(shí),就會(huì)被轉(zhuǎn)化成實(shí)力變量,被綁定到特定的實(shí)例上。
5、實(shí)例變量(self)的形式對(duì)類變量重新賦值后,類變量的值不會(huì)隨之變化。
6、實(shí)例變量對(duì)每一個(gè)對(duì)象是不可見(jiàn)的,每一個(gè)對(duì)象擁有著可能不同的值。
以上我們整理的知識(shí)點(diǎn)希望能夠幫助到大家,感謝大家對(duì)腳本之家的支持。
相關(guān)文章
關(guān)于CUDA out of memory的解決方案
這篇文章主要介紹了關(guān)于CUDA out of memory的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python?異步之在?Asyncio中如何運(yùn)行阻塞任務(wù)詳解
這篇文章主要為大家介紹了Python?異步之在?Asyncio?中運(yùn)行阻塞任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Tensorflow模型實(shí)現(xiàn)預(yù)測(cè)或識(shí)別單張圖片
這篇文章主要為大家詳細(xì)介紹了Tensorflow模型實(shí)現(xiàn)預(yù)測(cè)或識(shí)別單張圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
解決Cron定時(shí)任務(wù)中Pytest腳本無(wú)法發(fā)送郵件的問(wèn)題
文章探討解決在 Cron 定時(shí)任務(wù)中運(yùn)行 Pytest 腳本時(shí)郵件發(fā)送失敗的問(wèn)題,先優(yōu)化環(huán)境變量,再檢查 Pytest 郵件配置,接著配置文件確保 SMTP 服務(wù)正常,包括編輯相關(guān)文件、配置認(rèn)證信息等,還提及常見(jiàn)問(wèn)題排查,如防火墻等,最終使郵件功能在定時(shí)任務(wù)中成功運(yùn)行2025-01-01
利用python3篩選excel中特定的行(行值滿足某個(gè)條件/行值屬于某個(gè)集合)
這篇文章主要給大家介紹了關(guān)于利用python3篩選excel中特定的行(行值滿足某個(gè)條件/行值屬于某個(gè)集合)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python對(duì)象的生命周期源碼學(xué)習(xí)
這篇文章主要為大家介紹了Python對(duì)象的生命周期源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
selenium+python自動(dòng)化測(cè)試之頁(yè)面元素定位
這篇文章主要介紹了selenium+python自動(dòng)化測(cè)試之頁(yè)面元素定位,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
python中的classmethod與staticmethod
這篇文章主要介紹了python中的classmethod與staticmethod,2022-01-01
Python 進(jìn)程之間共享數(shù)據(jù)(全局變量)的方法
今天小編就為大家分享一篇Python 進(jìn)程之間共享數(shù)據(jù)(全局變量)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
基于Python+Turtle實(shí)現(xiàn)繪制簡(jiǎn)易的大風(fēng)車
大風(fēng)車,吱呀吱呦呦地轉(zhuǎn),這里的風(fēng)景呀真好看!天好看,地好看……一首熟悉的歌曲,是否已經(jīng)把你拉回了童年?本文將用Turtle庫(kù)繪制簡(jiǎn)易的大風(fēng)車,需要的可以參考一下2022-06-06

