2016-10-27 2 views
1

Моя задача на самом деле довольно проста. Может быть, я слишком привык к C++, чтобы не видеть свою ошибку. У меня есть два класса и список. В список должны быть включены все объекты класса 1, а класс1 также содержит список для всех объектов класса 2. Итак, мы имеем:Как создать «отдельные» объекты

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) 

Теперь проблема , что каждый объект2 находится в каждом объекте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 что-то могло произойти с этой ошибкой, во-первых, какую версию x 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

Смежные вопросы