3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
這是因?yàn)镻ython使用.。解析名稱的方式。在編寫時(shí)self.list,Python運(yùn)行時(shí)首先嘗試list通過在實(shí)例對象中查找名稱來解析名稱,如果找不到,則在類實(shí)例中進(jìn)行查找。
讓我們逐步研究它
self.list.append(1)
list對象中有名稱self嗎?
是的:使用它!完。
否:轉(zhuǎn)到2。
list對象的類實(shí)例中是否有名稱self?
是的:使用它!完
否:錯(cuò)誤!
但是,當(dāng)您綁定名稱時(shí),情況有所不同:
self.list = []
list對象中有名稱self嗎?
是:覆蓋它!
否:綁定!
因此,這始終是一個(gè)實(shí)例變量。
您的第一個(gè)示例list在類實(shí)例中創(chuàng)建一個(gè),因?yàn)檫@是當(dāng)時(shí)的活動(dòng)范圍(沒有self任何地方)。但是您的第二個(gè)示例list在的范圍內(nèi)顯式創(chuàng)建了一個(gè)self。
這個(gè)例子更有趣:
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']
刪除實(shí)例名稱后,可以通過self引用看到類名稱。

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
Python有關(guān)于查找名稱的有趣規(guī)則。如果您真的想改變主意,請嘗試以下代碼:
class testClass():
l = []
def __init__(self):
self.l = ['fred']
這將給每個(gè)實(shí)例一個(gè)變量l,該變量將屏蔽類變量l。如果這樣做,您仍然可以使用class變量self.__class__.l。
我的想法是……只要您這樣做instance.variable(即使對于方法名,它們只是值恰好是函數(shù)的變量),它都會(huì)在實(shí)例的字典中查找它。如果找不到它,它將嘗試在實(shí)例的“類”字典中查找它。僅當(dāng)變量被“讀取”時(shí)。如果將其分配給它,它將始終在實(shí)例字典中創(chuàng)建一個(gè)新條目。

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
在第一個(gè)示例中,list是類的一個(gè)屬性,由該類的所有實(shí)例共享。這意味著您甚至可以在沒有類型對象的情況下訪問它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']
添加回答
舉報(bào)