Python 类中的数组未初始化
我是python新手,正在努力学习。 问题 我被困在一个地方,在那里我初始化了循环中一个类的对象。在初始化过程中,我希望得到一个全新的对象,它的所有属性都重置了。但当类具有数组列表时,就不会发生这种情况。 示例如下:Python 类中的数组未初始化,python,Python,我是python新手,正在努力学习。 问题 我被困在一个地方,在那里我初始化了循环中一个类的对象。在初始化过程中,我希望得到一个全新的对象,它的所有属性都重置了。但当类具有数组列表时,就不会发生这种情况。 示例如下: Class-MyClass: id=“” aList=[] Class SecondClass:#忽略其内容 pid=“” anObj=MyClass() sc1=第二类() anobj.append(sc1) print str(len(anObj.aList)#给出输出1 an
Class-MyClass:
id=“”
aList=[]
Class SecondClass:#忽略其内容
pid=“”
anObj=MyClass()
sc1=第二类()
anobj.append(sc1)
print str(len(anObj.aList)#给出输出1
anObj=MyClass()#重新调整对象的斜体,因此我希望在java的行中得到一个空类
print str(len(anObj.aList)#给出输出1,为什么我刚刚重新初始化了对象“anObj”
您将静态属性与实例属性混淆了。您应该这样做:
Class MyClass:
def __init__(self):
self.id = ""
self.aList = []
基本区别在于,在您的实现中,aList
属性对于MyClass
的所有实例都是相同的。这就是为什么我们称它们为静态的原因,因为它们不会随实例的不同而变化。相反,上面定义的实例变量对于您创建的每个新实例都是唯一的。Y您将静态属性与实例属性混淆。您应该改为:
Class MyClass:
def __init__(self):
self.id = ""
self.aList = []
基本区别在于,在您的实现中,
aList
属性对于MyClass
的所有实例都是相同的。这就是为什么我们称它们为静态的原因,因为它们不会随实例的不同而变化。相反,上面定义的实例变量对于您创建的每个新实例都是唯一的。T这是对python的一个非常普遍的误解……实际上,MyClass.aList
是一个“静态”成员。理解这一点的关键是理解python如何查找对象的属性
首先,python查看属性的实例。如果它不在那里,则python会向上移动一个级别(到类)并在那里查找属性。如果它不在类上,则会查看基类(按照“方法解析顺序”)
因此,这(希望如此)解释了问题。您创建了MyClass
的一个实例,并获得对其列表的引用:
c = MyClass()
lst = c.aList
现在,请注意,c.aList
是MyClass.aList
,因为c
本身没有aList
属性
print(lst is MyClass.aList) # True
那么,我们如何解决这个问题呢?典型的解决方法是在初始化时将
aList
属性绑定到实例:
class MyClass(object):
def __init__(self):
self.aList = []
现在,
MyClass
没有aList
成员,但它的所有实例都将(并且它们的成员都将是不同的)。这是对python的一个非常常见的误解……实际上,MyClass.aList
是一个“静态的”理解这一点的关键是理解python如何查找对象的属性
首先,python查看属性的实例。如果它不在那里,则python会向上移动一个级别(到类)并在那里查找属性。如果它不在类上,则会查看基类(按照“方法解析顺序”)
因此,这(希望如此)解释了问题。您创建了MyClass
的一个实例,并获得对其列表的引用:
c = MyClass()
lst = c.aList
现在,请注意,c.aList
是MyClass.aList
,因为c
本身没有aList
属性
print(lst is MyClass.aList) # True
那么,我们如何解决这个问题呢?典型的解决方法是在初始化时将
aList
属性绑定到实例:
class MyClass(object):
def __init__(self):
self.aList = []
现在,MyClass
没有aList
成员,但是它的所有实例都会有(并且它们的成员都是不同的)