2017-06-04 73 views
2

我有一個類,我想在其中存儲同一類的對象的靜態引用列表。例如:在類級別屬性中存儲實例(自我)的列表?

class Apple: 

    NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red'), 
     Apple('Pink Lady', 'Pink')] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

這會導致錯誤。 爲什麼不能工作?

我已經改變了代碼以下,這似乎在控制檯上工作:

class Apple: 

    NICE_APPLES = [] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

Apple.NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red'), 
     Apple('Pink Lady', 'Pink')] 

有沒有更好的方式來做到這一點? 這是否會在模塊內部和外部工作,並且這取決於我導入模塊的方式?

+2

在完成創建類之前,您無法創建類的實例!它在創建之前不會被綁定到名稱上。 – jonrsharpe

+2

這聽起來像[XY](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)問題。你爲什麼想這樣做?你想達到什麼目的? –

+2

這種方法的一個潛在問題 - 無論實例添加到列表中的哪個位置 - 將在實例被刪除時維護列表,因爲沒有機制會自動刪除它們。更好的方法是使用現有的容器類之一,如列表和字典,或者可以使用自定義的容器類。類別不應該關心自己的實例的存在(或不存在)。另一方面,也許你的實例應該是'Apple'的子類,在這種情況下,會有'class .__子類__()'來跟蹤它們。 – martineau

回答

2

使用classmethod將蘋果添加到班級列表中。

class Apple: 

    NICE_APPLES = [] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

    @classmethod 
    def add_nice_apple(cls, name, colour): 
     cls.NICE_APPLES.append(cls(name, colour)) 


Apple.add_nice_apple('Elstar','Green') 
Apple.add_nice_apple('Braeburn','Red') 
+0

當然,這種方式是最乾淨的:)之一,再加上一個 –

+0

確實!最後,我保存了一個元組列表,當需要時,我可以在運行時使用方法將其轉換爲對象。如果我最終將它們存儲爲類實例,畢竟我會使用這個答案,因爲我發現它是最乾淨的。標記這一個被接受。 – Pepijn

1

申報NICE_APPLES作爲蘋果類空列表,然後裏面__init__(),當你完成所有分配的局部變量,追加self到列表中。

class Apple(object): 

    NICE_APPLES = [] 

    def __init__(self, name, color, keep=False): 
     self.name = name 
     self.color = color 

     if keep: 
      Apple.NICE_APPLES.append(self) 
+0

不會創建一個蘋果的所有實例的列表?我只想要一組預定義(硬編碼)值的列表。 – Pepijn

+0

啊。那麼,你可以給'__init __()'添加一個默認爲「False」的參數,然後只在該參數爲「True」時執行append。看到我編輯的答案。 –

+0

@olisch erm,什麼?該導入語句不會到達my_class_file中,並使Apple類忘記其真實姓名...... –

0

您可以從類方法來創建新的類實例,像這樣的,我覺得這是一個乾淨的方式喲做,如果你還想要OBJ創建的最近存儲除了hardcords的列表:

class Apple: 

    NICE_APPLES = [] 

    def __init__(self, name, colour): 
     self.name = name 
     self.colour = colour 

    @classmethod 
    def init_with_nice_apples(self, name, colour): 
     Apple.NICE_APPLES = [Apple('Elstar', 'Green'), Apple('Braeburn', 'Red')] #hardcore list 
     self.__init__(self,name, colour) 
     Apple.NICE_APPLES.append(self) 
     return self 

ap = Apple.init_with_nice_apples("Delicius", "Red") 
相關問題