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引用看到類名稱。

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

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']
添加回答
舉報