[英]Explicitly creating a new object in Python
我正在嘗試創建新對象並將其存儲在字典中。 但這似乎並沒有達到我的預期。
class Fruit:
name = ''
facts = []
def __init__(self, FruitName):
self.name = FruitName
facts = []
def addfact(self, FruitName):
if FruitName == 'banana':
self.facts.append('bananas contain potassium')
elif FruitName == 'orange':
self.facts.append('These are some facts about oranges')
else:
self.facts.append('Unrecognized fruit submitted')
Files = ['banana', 'orange', 'apple']
ObjLibrary = {}
for File in Files:
if not File in ObjLibrary:
ObjLibrary[File] = Fruit(File)
ObjLibrary[File].addfact(File)
print ObjLibrary['banana'].facts
print ObjLibrary['orange'].facts
print ObjLibrary['apple'].facts
我得到以下輸出:
['bananas contain potassium', 'These are some facts about oranges', 'Unrecognized fruit submitted']
['bananas contain potassium', 'These are some facts about oranges', 'Unrecognized fruit submitted']
['bananas contain potassium', 'These are some facts about oranges', 'Unrecognized fruit submitted']
現在,我懷疑發生的事情是我沒有按照我想要的方式顯式創建三個對象,而只是將字典中的所有三個項目都指向同一個對象。 我的問題是:為什么? 在循環的每一遍中, File
應該具有不同的值。 更重要的是,我該如何解決? 在我的“真實”代碼中,創建一個全新的變量來存儲每個對象是不切實際的。
謝謝你的幫助。
凱西
問題在於facts
是一個類變量,而不是實例變量。 您應該在__init__
內定義它(並在那里刪除無用的局部變量聲明):
class Fruit:
def __init__(self, FruitName):
self.name = FruitName
self.facts = []
def addfact(self, FruitName):
...
注意Python不是Java,因此不需要在類級別“聲明”屬性。
嘗試這個:
class Fruit:
name = ''
# remove this string facts = []
def __init__(self, FruitName):
self.name = FruitName
self.facts = [] # add "self."
...
在您的示例中,事實是類成員(而不是實例成員)
facts
定義為類屬性,即由該類的所有實例共享。 將作業__init__
:
def __init__(self, name):
self.name = name
self.facts = []
另外,類定義似乎並不是存儲事實的正確位置,當然,它們應該是addfact
參數, addfact
您都可以使用self.name
來訪問名稱:
def addfact(self, fact):
self.facts.append(fact)
類變量和實例變量之間有區別。 考慮以下:
>>> class Test:
... facts = [1]
... def __init__(self,v=None):
... if v:
... self.facts = v
...
>>> t = Test()
>>> t.facts
[1]
>>> Test.facts
[1]
>>> Test.facts = [2]
>>> t.facts
[2]
>>> t2 = Test([3])
>>> t.facts
[2]
>>> t2.facts
[3]
>>> Test.facts
[2]
>>> Test.facts = [4]
>>> t.facts
[4]
>>> t2.facts
[3]
該類的實例將繼承該類變量。 如果為實例更改它,它將保留為實例變量,而對類變量的更改將無關緊要。 如果您在類中進行了更改,而從未在實例中進行過更改。 實例將看到class變量的更新值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.