亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python類實例變量和類變量

python類實例變量和類變量

慕碼人8056858 2019-10-21 09:23:20
我在理解類/實例變量如何在Python中工作時遇到問題。我不明白為什么當我嘗試這段代碼時列表變量似乎是一個類變量class testClass():    list = []    def __init__(self):        self.list.append('thing')p = testClass()print p.listf = testClass()print f.list輸出:['thing']['thing', 'thing']當我這樣做時,它似乎是一個實例變量class testClass():    def __init__(self):        self.list = []        self.list.append('thing')p = testClass()print p.listf = testClass()print f.list輸出:['thing']['thing']
查看完整描述

3 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

這是因為Python使用.。解析名稱的方式。在編寫時self.list,Python運行時首先嘗試list通過在實例對象中查找名稱來解析名稱,如果找不到,則在類實例中進行查找。


讓我們逐步研究它


self.list.append(1)

list對象中有名稱self嗎?

是的:使用它!完。

否:轉到2。

list對象的類實例中是否有名稱self?

是的:使用它!完

否:錯誤!

但是,當您綁定名稱時,情況有所不同:


self.list = []

list對象中有名稱self嗎?

是:覆蓋它!

否:綁定!

因此,這始終是一個實例變量。


您的第一個示例list在類實例中創建一個,因為這是當時的活動范圍(沒有self任何地方)。但是您的第二個示例list在的范圍內顯式創建了一個self。


這個例子更有趣:


class testClass():

    list = ['foo']

    def __init__(self):

        self.list = []

        self.list.append('thing')


x = testClass()

print x.list

print testClass.list

del x.list

print x.list

那將打?。?/p>


['thing']

['foo']

['foo']

刪除實例名稱后,可以通過self引用看到類名稱。


查看完整回答
反對 回復 2019-10-21
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

Python有關于查找名稱的有趣規則。如果您真的想改變主意,請嘗試以下代碼:


class testClass():

    l = []

    def __init__(self):

        self.l = ['fred']

這將給每個實例一個變量l,該變量將屏蔽類變量l。如果這樣做,您仍然可以使用class變量self.__class__.l。


我的想法是……只要您這樣做instance.variable(即使對于方法名,它們只是值恰好是函數的變量),它都會在實例的字典中查找它。如果找不到它,它將嘗試在實例的“類”字典中查找它。僅當變量被“讀取”時。如果將其分配給它,它將始終在實例字典中創建一個新條目。


查看完整回答
反對 回復 2019-10-21
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

在第一個示例中,list是類的一個屬性,由該類的所有實例共享。這意味著您甚至可以在沒有類型對象的情況下訪問它testClass:


>>> class testClass():

...     list = []

...     def __init__(self):

...             self.list.append("thing")

... 

>>> testClass.list

[]

>>> testClass.list.append(1)

>>> testClass.list

[1]

但是所有對象都list與該類以及彼此共享該屬性:


>>> testObject = testClass()

>>> testObject.list

[1, 'thing']

>>> testClass.list

[1, 'thing']

>>> 

>>> testObject2 = testClass()

>>> testClass.list

[1, 'thing', 'thing']

>>> testObject2.list

[1, 'thing', 'thing']


查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 519 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號