我是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)
答案 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
成员,但所有成员都会(并且他们的成员都是不同的)。