2016-10-27 20 views
1

我的任務其實很簡單。也許我太習慣C++,看不到我的錯。 我有兩個類和一個列表。 該列表應該包含由class1構成的所有對象,而class1也包含用於class2的所有對象的列表。 因此,我們有:如何創建「個人」對象

All_Objects1 = []  # For class1 objects 

class class1 (object): 
    All_Objects2 = [] # For class2 objects 

class class2 (object): 
    name = "" 
    number = 0 

現在我這樣做:

# class1 objects: 
obj1= class1() 
obj2= class1() 

# class2 objects 
obj3 = class2() 
obj3.name, obj3.number = "hello world", 10 
obj4 = class2() 
obj4.name, obj3.number = "hello europe", 20 
obj5 = class2() 
obj5.name, obj3.number = "hello asia", 30 
obj6 = class2() 
obj6.name, obj3.number = "hello africa", 40 

# Attach object3 and object4 to object1 
obj1.All_Objects2.append(obj3) 
obj1.All_Objects2.append(obj4) 

# Attach object5 and object6 to object2 
obj2.All_Objects2.append(obj5) 
obj2.All_Objects2.append(obj6) 

# Attach obj1 and obj2 to the global list.  
All_Objects1.append(obj1) 
All_Objects1.append(obj2) 

最後我做一個打印檢查,如果一切是它屬於:

print (len(All_Objects1[0].All_Objects2)) # Should be 2. 
for i in All_Objects1[0].All_Objects2: 
    print (i.name)      # Should be world and europe. 

print (len(All_Objects1[1].All_Objects2))  # Should be 2. 
for i in All_Objects1[1].All_Objects2:  # Should be asia, africa. 
    print (i.name) 

現在的問題是,每個對象都在每個對象中1,我不知道爲什麼。

在我實際的程序我做這樣的事情,你會在C實際工作++:

#pseudo 
for i in all_information: 
    if (i==Keyword): 
     currentObject = class1() 
     All_objects.append(currentObject) 

,然後我會在我的列表中的某些獨立的對象。但在Python中,我認爲我無法覆蓋「currentObject」。

非常感謝您的幫助。

+0

嘗試向類中添加一個init函數;我想也許python不知道爲它創建新的內存塊:https://www.tutorialspoint.com/python/python_classes_objects。htm 甚至一個空/空init(只寫通過作爲唯一的命令)應該訣竅 –

+1

爲什麼你要在類之外使用第一個列表?爲什麼你沒有初始化課堂?爲什麼你不使用繼承? –

+1

'All_Objects2 = []'在所有對象中創建共享元素。使用'__init__'函數創建'self.All_Objects2 = []' – furas

回答

1

在Python中,所有在任何函數之外聲明的類成員都是靜態成員。所以它們由每個從類實例化的對象共享。

你想要的是以下幾點:

class class1 (object): 
    def __init__(self): 
     self.All_Objects2 = [] # For class2 objects 

class class2 (object): 
    def __init__(self): 
     self.name = "" 
     self.number = 0 
2

在Python中,有些東西可能會造成這個錯誤,首先您使用的Python版本是×?

我還沒有在我的控制檯上測試過,但我猜測這是一個初始化問題,對於你如何聲明列表,我寧願建議使用更多的Pythonic方法,我的意思是,構建一個構造函數並使用關鍵字self爲實例變量,如果這樣做的話,我可以擴展我的答案,解釋爲什麼發生這種情況。

在1級和2級創建這樣的方法:

def __init__(self, object_list=None) : # use corresponding classes attributes. 
    if self.name_of_your_variable: 
      self.name_of_your_variable= [] # or proper value 

適應給你的班,讓我知道,如果它的工作原理,只要我回家,我將擴展它

1

你只需要以初始化類。 init並且您只需要一個所有對象列表。你可以在下面找到類的例子。

class firstA(): 
    def __init__(self): 
     self.All_Objects = [] 

class secondB(): 
    def __init__(self): 
     self.name ="None" 
     self.number = 0 

當你調用這個類時,初始化將完成:-)這在python2/3中是非常好的。

無論您在課堂外初始化什麼,都將被視爲靜態變量!因此,在你的例子中的All_Objects1列表。

希望這個澄清你的疑惑!祝你今天愉快。

+0

Trotzdem Danke :-) – Fabian