簡體   English   中英

在Python中明確創建新對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM