如何创建"个人"对象

时间:2016-10-27 12:56:03

标签: python object

我的任务其实非常简单。也许我太习惯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)

现在的问题是,每个object2都在每个object1中,我不知道为什么。

在我的实际程序中,我做了类似这样的事情,实际上在c ++中有用:

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

然后我的列表中会有一些独立的对象。但在Python中,我认为我不知道如何覆盖" currentObject"。

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:2)

在Python中,有些人可能会犯这个错误,首先是你使用的Python版本是什么?

我还没有在我的控制台上进行过测试,但我猜这是一个初始化问题,对于你如何声明列表,我宁愿建议使用更多的Pythonic方法,我的意思是,构建一个构造函数并使用关键字{ {1}}例如变量,如果这有效,我可以扩展我的答案,解释为什么会发生这种情况。

在第1课和第2课中创建这样的方法:

self

让它适应你的课程并让我知道,如果它有效,一旦我回到家,我会延长它

答案 1 :(得分: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 :(得分: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列表。

希望这能澄清你的疑惑!祝你有愉快的一天。