如何从列表中创建和检索类对象

时间:2014-01-22 07:00:29

标签: python python-3.4

我有以下类型的xml:

<?xml version="1.0" encoding="UTF-8"?>
<RootNode>
<childElem>
<prop1 type="int">1</prop1>
<prop2 type="int">2</prop2>
</childelem>
<childElem>
<prop1 type="int">3</prop1>
<prop2 type="int">4</prop2>
</childelem>
<childElem>
<prop1 type="int">5</prop1>
<prop2 type="int">6</prop2>
</childelem>
<childElem>
<prop1 type="int">7</prop1>
<prop2 type="int">8</prop2>
</childelem>
</RootNode>

我已经定义了将所有子元素存储为类的不同实例的类。 我试图将对象附加到列表中,然后检索。

在这个xml中总共有4个孩子。 我在创建每个对象后打印了每个对象的属性。 我看到每个对象都有不同的属性值。

但之后,当我尝试从for循环中的列表中检索每个对象并打印每个检索到的对象的属性时,它会打印最后一个childelem对象四次。

以下是代码段

def getObjects(self,xmlStr,elem):
    objList = []
    root = ET.fromstring(xmlStr)
    rootNode = root.find(elem)
    for obj in rootNode.findall('childElem'):
        myObj = Obj()
        for props in obj:
            myObj.populate(props.tag,props.text)
        print(">>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<")
        print(myObj.getProps())
        print(">>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<")
        objList.append(myObj)

    for obj1 in objList:
        print(obj1.getProps())
        print("@@@@@@@@@@@@@@@@@@@@@@@@@@")
    return objList
class Obj:
    properties = {}

    def populate(self,name,value):
        self.properties[name] = value
    def getProps(self)
        return self.properties

我是Python的新手,可以解释一下有什么问题吗? 为什么在检索循环中只有最后一个childElem会出现四次? 我该如何纠正错误?

这里是输出

>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
{'prop1': '1', 'prop2': '2'}
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
{'prop1': '3', 'prop2': '4'}
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
{'prop1': '5', 'prop2': '6'}
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
{'prop1': '7', 'prop2': '8'}
>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<
{'prop1': '7', 'prop2': '8'}
@@@@@@@@@@@@@@@@@@@@@@@@@@
{'prop1': '7', 'prop2': '8'}
@@@@@@@@@@@@@@@@@@@@@@@@@@
{'prop1': '7', 'prop2': '8'}
@@@@@@@@@@@@@@@@@@@@@@@@@@
{'prop1': '7', 'prop2': '8'}
@@@@@@@@@@@@@@@@@@@@@@@@@@

1 个答案:

答案 0 :(得分:0)

您正在Obj的不同实例之间共享类中的可变字典。如果您将其更改为实例变量(通过在self.properties中设置Obj.__init__),则代码应按您的意愿运行:

class Obj:

    def __init__(self):
        self.properties = {}

    # The rest of Obj's methods.

按照目前的情况,您的代码会创建一个字典Obj.properties(仍然可以通过实例上的self.properties访问)。然后myObj.populate调用每个更新一个字典,因此最后一个元素的详细信息被打印4次。