python - 如何从文本文件创建Python对象图(具有循环依赖)

标签 python object

我有一个表达对象及其互连的文本文件,我想构建相应的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 中。

一些替代方案:

  1. 读取文件两次。第一次创建对象,第二次构建链接。但读两次看起来很难看(并且不适用于标准输入)。

  2. 创建所有带有文本链接的对象。然后扫描所有对象,将文本链接替换为对象引用。

  3. 如果目标不存在,则创建一个占位符对象。然后在读取该行时填写占位符。但如果我想检查丢失的链接,我需要再进行一次。

我怀疑有一个常见的 Python 习惯用法可以做到这一点,我想避免让事情变得过于复杂。另外,让我的对象类处理此图形创建是最干净的,还是应该有一个单独的解析器类?

(当然,我的对象比精简的示例更复杂。除此之外,我计划找到连接的组件,如果这会有所不同的话。)

最佳答案

您可以使用类属性dicts来按标签维护实例和链接。然后您可以将 link1link2 实现为属性:

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/

相关文章:

python - 属性错误: 'float' object has no attribute 'iloc'

javascript - 如何将对象数组转换为数组数组数组

javascript - 函数中的 if 语句创建附加对象

javascript - 关于对象内部 const 声明的困惑

python - 调用递归函数时出现 WMI 意外 COM 错误 -2147352567

python - 如何基于 yml 文件但使用不同的 Python 版本创建新的 conda env

python - 类子集的 COCO api 评估

python - 在Python中将有向图(列表数组)转换为无向图(列表数组)的快速方法?

javascript - Ionic V4 JS 对象

ios - 来自其他类中的类的对象以访问 UIView iOS Objective-c