类中的数组未初始化

时间:2015-02-26 01:06:30

标签: python

我是python的新手并且正在努力学习。 的问题 我被困在一个我初始化的地方和循环中一个类的对象。在这个初始化期间,我希望我得到一个全新的对象,其所有属性都被重置。但是对于类具有的数组列表,这不会发生。 示例如下:

Class MyClass:
	id=""
	aList=[]
Class SecondClass:  # ignore its content
	pid=""
	
anObj=MyClass() 
sc1=SecondClass()
anobj.append(sc1)
print  str(len(anObj.aList)   # gives the output 1

anObj=MyClass() # reinitalizing the object, so I expect on the lines of java that I get an empty class
print  str(len(anObj.aList)   # gives the output 1, why I just reinitialized the object "anObj"

我想要的是在执行anObj = MyClass()之后应该重置所有属性。喜欢java。似乎anObj(数组)被视为类的静态变量(使用Java语言) 更深层次的问题 我不想明确地执行anObj.aList = [],因为我的问题是在下面的代码中

aCollection=[]
for x in (0,3):
anObj=MyClass() 
sc=getSecondClassObjectWithDifferentValues()
anobj.append(sc)
aCollection.append(anOb)
我把anObj放在aCollection中,最终我想在我说的状态下访问它们。 在此先感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您将静态属性与实例属性混淆。你应该这样做:

Class MyClass:
    def __init__(self):
        self.id = ""
        self.aList = []

根本区别在于,在您的实现中,aList的所有实例的属性MyClass将是相同。这就是我们称之为 static 的原因,因为它们不会在实例之间变化。相反,对于您创建的每个新实例,上面定义的实例变量将是唯一的。

答案 1 :(得分:2)

这是与python的一个超常见的误解...有效,MyClass.aList a"静态"会员。理解这一点的关键是理解python如何在对象上查找属性。

首先,python查看属性的实例。如果它不存在,则python向上移动一个级别(到该类)并在那里查找属性。如果它不在课堂上,它将查看基类(在"方法解析顺序")。

所以,这(希望)解释了这个问题。您创建MyClass的实例并获取对其列表的引用:

c = MyClass()
lst = c.aList

现在,请注意,c.aList MyClass.aList,因为c没有aList属性<\ n}自己的。

print(lst is MyClass.aList)  # True

那么,我们如何解决这个问题呢?对此的典型修复是在初始化时将aList属性绑定到实例:

class MyClass(object):
    def __init__(self):
        self.aList = []

现在,MyClass没有aList成员,但所有成员都会(并且他们的成员都是不同的)。