日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python类变量共享吗_第7.12节 可共享的Python类变量

發(fā)布時(shí)間:2023/12/4 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python类变量共享吗_第7.12节 可共享的Python类变量 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第7.12節(jié) 可共享的Python類變量

一、?? ?引言

在上節(jié)已經(jīng)引入介紹了類變量和實(shí)例變量,類體中定義的變量為類變量,默認(rèn)屬于類本身,實(shí)例變量是實(shí)例方法中定義的self對(duì)象的變量,對(duì)于每個(gè)實(shí)例都是獨(dú)有數(shù)據(jù),而類變量是該類所有實(shí)例共享的屬性和方法。

二、?? ?類變量的定義方式

類變量的定義其實(shí)就是對(duì)變量賦值,有如下方式可以進(jìn)行類變量的定義:

1.?? ?在類體代碼中,直接用變量名賦值。類體代碼是在類定義時(shí)執(zhí)行;

2.?? ?在實(shí)例方法中(含構(gòu)造方法和普通方法),直接用“類名.變量名”方式賦值;

3.?? ?在類方法中,直接用“類名.變量名”或“cls.變量名”方式賦值,關(guān)于cls請(qǐng)參考下面“類方法”章節(jié)的解釋;

4.?? ?在類外調(diào)用方代碼中直接用“類名.變量名”方式賦值。

注意:類變量無(wú)論是哪種方法定義后,會(huì)立即對(duì)該類所有實(shí)例對(duì)象產(chǎn)生影響,所有實(shí)例無(wú)論是類變量定義前就產(chǎn)生的實(shí)例還是類變量定義后的實(shí)例都可以訪問該變量。

三、?? ?類變量的訪問方式

類變量的訪問方式與類變量的定義方式有2點(diǎn)不同,一是因?yàn)轭愺w代碼僅在類定義時(shí)執(zhí)行,因此不能在類定義后再通過類體代碼訪問,二是類變量可以在類外調(diào)用方通過實(shí)例方式訪問。具體支持的訪問方式如下:

1.?? ?在實(shí)例方法中(含構(gòu)造方法和普通方法),直接用“類名.變量名”方式訪問;

2.?? ?在類方法中,直接用“類名.變量名”方式訪問;

3.?? ?在類外調(diào)用方代碼中直接用“類名.變量名”方式訪問;

4.?? ?在類外調(diào)用方代碼中直接用“實(shí)例名.變量名”方式訪問,注意這種方式不能用來直接賦值,只能讀取,如果是賦值就變成了實(shí)例變量的定義。

從以上說明中,可以得知:

1.?? ?類變量是可以在類定義的實(shí)例方法和類方法、以及類外調(diào)用時(shí)動(dòng)態(tài)增加,并且一旦增加,對(duì)所有已經(jīng)定義及后續(xù)需要新定義的實(shí)例變量都可見;

2.?? ?程序通過對(duì)象訪問類變量,其本質(zhì)還是通過類名在訪問類變量,但如果類變量和實(shí)例變量重名時(shí),必須通過類名才能訪問類變量。這是因?yàn)镻ython總是先到實(shí)例對(duì)象中查找屬性,再到類屬性中查找屬性,有點(diǎn)類似局部變量和全局變量的關(guān)系;

3.?? ?Python 允許通過對(duì)象訪問類變量,但如果程序通過對(duì)象嘗試對(duì)類變量賦值,此時(shí)性質(zhì)就變了,Python 是動(dòng)態(tài)語(yǔ)言,賦值語(yǔ)句往往意味著定義新的實(shí)例變量。因此,如果程序通過對(duì)象對(duì)類變量賦值,其實(shí)不是對(duì)“類變量賦值”,而是定義新的實(shí)例變量。

如果把類當(dāng)成類命名空間,那么類變量其實(shí)就是定義在類命名空間內(nèi)的變量, Python 可以使用類來讀取、修改類變量。對(duì)于類變量而言,它們就是屬于在類命名空間內(nèi)定義的變量,因此程序不能直接訪問這些變量,主要使用類名的方式來訪問類變量,同時(shí)Python 完全允許使用實(shí)例對(duì)象來訪問該對(duì)象所屬類的類變量,但Python主要推薦使用類名訪問類變量。因此老猿強(qiáng)烈建議大家使用類名訪問類變量,使用實(shí)例方式訪問很容易出錯(cuò),大家可以結(jié)合下面的舉例好好理解一下。

四、?? ?舉例

1、?? ?定義一個(gè)類VarTest和實(shí)例,在類體代碼中對(duì)類變量classvar賦值

class VarTest():

classvar='classvar在類體代碼賦值'

定義個(gè)實(shí)例:var=VarTest()

2、?? ?查看相關(guān)變量的值

查看var.classvar和VarTest.classvar的值,都顯示為:'classvar在類體代碼賦值'

執(zhí)行:var.classvar ?is VarTest.classvar,返回True

3、?? ?執(zhí)行賦值語(yǔ)句

var.classvar='classvar在類外通過實(shí)例賦值'

4、?? ?再次查看相關(guān)變量的值

此時(shí)查看var.classvar和VarTest.classvar的值,二者已經(jīng)不同,一個(gè)是'classvar在類外通過實(shí)例賦值',一個(gè)是'classvar在類體代碼賦值'

執(zhí)行:var.classvar ?is VarTest.classvar,返回False

相關(guān)代碼執(zhí)行截圖:

5、?? ?如果上面第3個(gè)步驟不是通過直接給變量賦值,而是先引用再賦值會(huì)怎么樣?看下面代碼的執(zhí)行情況:

注本次新定義一個(gè)實(shí)例,可以看到最開始的var1.classvar和VarTest.classvar是同一個(gè)變量,執(zhí)行var1.classvar+=的操作語(yǔ)句,這個(gè)語(yǔ)句的效果等同于“var1.classvar=var1.classvar+' ? 在類體外通過實(shí)例訪問類變量'”

可以看到,執(zhí)行后還是新定義了一個(gè)實(shí)例變量。

本節(jié)介紹了類變量的定義和使用方法,并舉例進(jìn)行了說明,雖然類變量的定義和訪問可以通過實(shí)例方式進(jìn)行,但老猿強(qiáng)烈推薦大家按類名方式進(jìn)行定義和訪問。

老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介紹老猿學(xué)習(xí)Python后總結(jié)的學(xué)習(xí)經(jīng)驗(yàn),這些經(jīng)驗(yàn)有助于沒有接觸過Python的程序員可以很容易地進(jìn)入Python的世界。

歡迎大家批評(píng)指正,謝謝大家關(guān)注!

總結(jié)

以上是生活随笔為你收集整理的python类变量共享吗_第7.12节 可共享的Python类变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。