我有一个表达对象及其互连的文本文件,我想构建相应的Python对象结构,但我不确定处理循环依赖的最佳方法是什么。
为了具体说明这一点,假设我有一个文件:
a: b, c, other info for creating a
b: a, c, info...
c: a, d, info...
d: a, b, info...
我想创建对象 A、B、C、D,其中 A.link1 = B、A.link2 = C 等等。问题是当我解析第一行时,对象 B 和 C 不存在,因此我无法将它们放入 A 中。
一些替代方案:
读取文件两次。第一次创建对象,第二次构建链接。但读两次看起来很难看(并且不适用于标准输入)。
创建所有带有文本链接的对象。然后扫描所有对象,将文本链接替换为对象引用。
如果目标不存在,则创建一个占位符对象。然后在读取该行时填写占位符。但如果我想检查丢失的链接,我需要再进行一次。
我怀疑有一个常见的 Python 习惯用法可以做到这一点,我想避免让事情变得过于复杂。另外,让我的对象类处理此图形创建是最干净的,还是应该有一个单独的解析器类?
(当然,我的对象比精简的示例更复杂。除此之外,我计划找到连接的组件,如果这会有所不同的话。)
最佳答案
您可以使用类属性dicts
来按标签维护实例和链接。然后您可以将 link1
和 link2
实现为属性:
class Node(object):
links = {}
registry = {}
def __init__(self, label, *link_labels):
self.label = label
self.links[label] = list(link_labels)
self.registry[label] = self
@property
def link1(self):
try:
return self.registry[self.links[self.label][0]]
except (KeyError, IndexError):
return None
def __str__(self):
return 'Node: ' + self.label
> a = Node('a', 'b', 'c')
> b = Node('b', 'a', 'c')
> c = Node('c', 'a', 'd')
> d = Node('d', 'a', 'b')
> print(a.link1)
> print(b.link1)
> print(c.link1)
> print(d.link1)
Node: b
Node: a
Node: a
Node: a
关于python - 如何从文本文件创建Python对象图(具有循环依赖),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190738/