gpt4 book ai didi

Python 嵌套对象无法检索函数中的值

转载 作者:行者123 更新时间:2023-11-28 20:52:17 25 4
gpt4 key购买 nike

我正在尝试构建一个代表已解析配置文件的树结构(配置文件具有层次结构)。我将其表示为:

class configContainer():

treeDict = {}
instances = {}

class configObject():

def __init__(self, name, configLine, parent):
self.name = name # Assign to the line number to make unique
self.parent = parent
self.children = []
self.configLine = configLine # Actual line of the configuration
configContainer.instances[name] = self

configContainer 包含一组对象。 configContainer.instances 使用“line#”键映射到对象。 treeDict 执行类似的映射,但使用不同的键(我在创建整个容器后创建 treeDict)。

然后我尝试在两个不同的 configContainers 中引用两个对象。这在 __main__ 中运行良好。但是当我将两个 configContainer 传递给一个函数时,实例总是从 configContainer2

返回对象
if __name__ == "__main__":


f1 = open('rfile', 'r')
configFile1 = f1.read()
f1.close()

configTree1 = parseConfig(configFile1)
configTree1.treeDict = createTreeDict(configTree1)
zObject1 = configTree1.instances["line10"]


f2 = open('sfile', 'r')
configFile2 = f2.read()
f2.close()

configTree2 = parseConfig(configFile2)
configTree2.treeDict = createTreeDict(configTree2)
zObject2 = configTree2.instances["line10"]

print "\n\nFrom __main__"
print "###########################"
print configTree1
print configTree2
print zObject1
print zObject2


compareConfigurations(configTree1, configTree2)


def compareConfigurations(tmpTree1, tmpTree2):

print "\n\nFrom compareConfigurations"
print "###########################"
print tmpTree1
print tmpTree2
zObject1 = tmpTree1.instances["line10"]
zObject2 = tmpTree2.instances["line10"]
print zObject1
print zObject2

结果是:

### From __main__

<__main__.configContainer instance at 0xb77a34ec>

<__main__.configContainer instance at 0xb740a68c>

<__main__.configObject instance at 0xb740e3ac>

<__main__.configObject instance at 0xb7414bcc>


### From compareConfigurations

<__main__.configContainer instance at 0xb77a34ec>

<__main__.configContainer instance at 0xb740a68c>

<__main__.configObject instance at 0xb7414bcc>

<__main__.configObject instance at 0xb7414bcc>

我不明白为什么我总是从 compareConfigurations 中取回 0xb7414bcc 对象?

最佳答案

configContainer.instances 是一个类属性,因此如果您为某个类的任何实例修改它,它将针对该类的所有实例进行更改。使用您当前的代码,任何时候您创建一个具有相同名称的新 configObject 时,它都会覆盖 configContainer.instances 中该名称的条目。您应该使 instances 成为 configContainer 的实例属性,或者确保您的 configObjects 具有不同的名称。

class configContainer():
def __init__(self):
self.instances = {}
...

这是正在发生的事情的一个简单示例:

>>> cc1 = configContainer()
>>> cc2 = configContainer()
>>> cc1.instances["line10"] = "foo"
>>> configContainer.instances
{'line10': 'foo'}
>>> cc2.instances["line10"] = "bar"
>>> configContainer.instances
{'line10': 'bar'}
>>> cc1.instances
{'line10': 'bar'}

关于Python 嵌套对象无法检索函数中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7070944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com