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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

第7.12節 可共享的Python類變量

一、?? ?引言

在上節已經引入介紹了類變量和實例變量,類體中定義的變量為類變量,默認屬于類本身,實例變量是實例方法中定義的self對象的變量,對于每個實例都是獨有數據,而類變量是該類所有實例共享的屬性和方法。

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

類變量的定義其實就是對變量賦值,有如下方式可以進行類變量的定義:

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

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

3.?? ?在類方法中,直接用“類名.變量名”或“cls.變量名”方式賦值,關于cls請參考下面“類方法”章節的解釋;

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

注意:類變量無論是哪種方法定義后,會立即對該類所有實例對象產生影響,所有實例無論是類變量定義前就產生的實例還是類變量定義后的實例都可以訪問該變量。

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

類變量的訪問方式與類變量的定義方式有2點不同,一是因為類體代碼僅在類定義時執行,因此不能在類定義后再通過類體代碼訪問,二是類變量可以在類外調用方通過實例方式訪問。具體支持的訪問方式如下:

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

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

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

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

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

1.?? ?類變量是可以在類定義的實例方法和類方法、以及類外調用時動態增加,并且一旦增加,對所有已經定義及后續需要新定義的實例變量都可見;

2.?? ?程序通過對象訪問類變量,其本質還是通過類名在訪問類變量,但如果類變量和實例變量重名時,必須通過類名才能訪問類變量。這是因為Python總是先到實例對象中查找屬性,再到類屬性中查找屬性,有點類似局部變量和全局變量的關系;

3.?? ?Python 允許通過對象訪問類變量,但如果程序通過對象嘗試對類變量賦值,此時性質就變了,Python 是動態語言,賦值語句往往意味著定義新的實例變量。因此,如果程序通過對象對類變量賦值,其實不是對“類變量賦值”,而是定義新的實例變量。

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

四、?? ?舉例

1、?? ?定義一個類VarTest和實例,在類體代碼中對類變量classvar賦值

class VarTest():

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

定義個實例:var=VarTest()

2、?? ?查看相關變量的值

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

執行:var.classvar ?is VarTest.classvar,返回True

3、?? ?執行賦值語句

var.classvar='classvar在類外通過實例賦值'

4、?? ?再次查看相關變量的值

此時查看var.classvar和VarTest.classvar的值,二者已經不同,一個是'classvar在類外通過實例賦值',一個是'classvar在類體代碼賦值'

執行:var.classvar ?is VarTest.classvar,返回False

相關代碼執行截圖:

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

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

可以看到,執行后還是新定義了一個實例變量。

本節介紹了類變量的定義和使用方法,并舉例進行了說明,雖然類變量的定義和訪問可以通過實例方式進行,但老猿強烈推薦大家按類名方式進行定義和訪問。

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

歡迎大家批評指正,謝謝大家關注!

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。