python中類變量與成員變量的使用注意點(diǎn)總結(jié)
前言
最近在用python寫(xiě)一個(gè)項(xiàng)目,發(fā)現(xiàn)一個(gè)很惡心的bug,就是同由一個(gè)類生成的兩個(gè)實(shí)例之間的數(shù)據(jù)竟然會(huì)相互影響,這讓我非常不解。后來(lái)聯(lián)想到j(luò)ava的類有類變量也有實(shí)例變量,因此翻閱了相關(guān)資料,發(fā)現(xiàn)python也有類似的類變量和實(shí)例變量,下面來(lái)看看詳細(xì)的介紹。
看下面的示例代碼:
class A: x = 0 def __init__(self): self.y = 0
x就是類變量,y就是實(shí)例變量。
原則上是沒(méi)有錯(cuò)的,但是實(shí)際用的時(shí)候就發(fā)現(xiàn)一些惡心的問(wèn)題(也就是我找了三天的bug)。。。比如下面的代碼:
class A:
x = []
y = 0
def __init__(self):
pass
def add(self):
self.x.append('1')
self.y+=1
a=A()
print a.x,a.y
print A.x,A.y
a.add()
print a.x,a.y
print A.x,A.y
b=A()
print b.x,b.y
print A.x,A.y
這里很明顯x和y都是類變量,add的作用是分別對(duì)x和y做出修改。然后構(gòu)造一個(gè)實(shí)例a,對(duì)實(shí)例a的值進(jìn)行修改,最后構(gòu)造實(shí)例b。
本以為這個(gè)結(jié)果是顯而易見(jiàn)的,然而他輸出的結(jié)果卻是:
[] 0 [] 0 ['1'] 1 ['1'] 0 ['1'] 0 ['1'] 0
問(wèn)題在哪?明明x和y都是類變量,在第二組print中為什么a.x和b.x一樣,但是a.y和b.y就是不一樣呢?
想了半天悟了一個(gè)道理。。。就是對(duì)于python來(lái)說(shuō),類變量的確是所有類共有的東西。但是那是在我們用的同一個(gè)引用的情況下,比如對(duì)于[]對(duì)象的append方法就是公用一個(gè)類變量了;但是對(duì)于賦值語(yǔ)句來(lái)說(shuō),如果在類中對(duì)類變量使用了賦值語(yǔ)句,那么python就會(huì)生成一個(gè)該對(duì)象的副本,以后的操作都是基于這個(gè)副本而不會(huì)對(duì)原來(lái)的類對(duì)象造成影響。這樣就解釋的通上面的現(xiàn)象了。
那么為了杜絕自己忘記類變量和實(shí)例變量的區(qū)別導(dǎo)致本不想公用變量的時(shí)候公用了變量,最好的辦法就是在每個(gè)類中使用變量的時(shí)候重新初始化一下,這樣就不會(huì)導(dǎo)致意外了。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
一文帶你安裝opencv與常用庫(kù)(保姆級(jí)教程)
Python OpenCV是一種流行的計(jì)算機(jī)視覺(jué)庫(kù),使用它可以進(jìn)行圖像處理、視頻處理等操作,下面這篇文章主要給大家介紹了關(guān)于安裝opencv與常用庫(kù)的相關(guān)資料,需要的朋友可以參考下2023-05-05
python實(shí)現(xiàn)多線程網(wǎng)頁(yè)下載器
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)一個(gè)多線程網(wǎng)頁(yè)下載器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Anaconda+VSCode配置tensorflow開(kāi)發(fā)環(huán)境的教程詳解
Anaconda是一個(gè)開(kāi)源的python發(fā)行版本,是現(xiàn)在比較流行的python數(shù)據(jù)科學(xué)平臺(tái),可以對(duì)python的科學(xué)包做到有效管理。這篇文章主要介紹了Anaconda+VSCode配置tensorflow開(kāi)發(fā)環(huán)境,需要的朋友可以參考下2020-03-03
python字符串加密解密的三種方法分享(base64 win32com)
這篇文章主要介紹了python字符串加密解密的三種方法,包括用base64、使用win32com.client、自己寫(xiě)的加密解密算法三種方法,大家參考使用吧2014-01-01
Python?異步之在?Asyncio中如何運(yùn)行阻塞任務(wù)詳解
這篇文章主要為大家介紹了Python?異步之在?Asyncio?中運(yùn)行阻塞任務(wù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
python爬蟲(chóng)數(shù)據(jù)保存到mongoDB的實(shí)例方法
在本篇文章里小編給大家整理的是一篇關(guān)于python爬蟲(chóng)數(shù)據(jù)保存到mongoDB的實(shí)例方法,有需要的朋友們可以參考下。2020-07-07
Python matplotlib 繪制雙Y軸曲線圖的示例代碼
Matplotlib是非常強(qiáng)大的python畫(huà)圖工具,這篇文章主要介紹了Python matplotlib 繪制雙Y軸曲線圖,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
解決django前后端分離csrf驗(yàn)證的問(wèn)題
今天小編就為大家分享一篇解決django前后端分離csrf驗(yàn)證的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
基于PyQt5實(shí)現(xiàn)圖轉(zhuǎn)文功能(示例代碼)
PyQt提供了一個(gè)設(shè)計(jì)良好的窗口控件集合,具有更方便的操作性。學(xué)過(guò)VB的同學(xué)會(huì)知道,相比與VB的使用,在界面設(shè)計(jì)上元素更豐富,這篇文章主要介紹了基于PyQt5完成的圖轉(zhuǎn)文功能,需要的朋友可以參考下2022-06-06
Python編程實(shí)現(xiàn)tail-n查看日志文件的方法
這篇文章主要介紹了Python編程實(shí)現(xiàn)tail-n查看日志文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

