gpt4 book ai didi

python - 如何避免循环依赖?

转载 作者:行者123 更新时间:2023-12-01 07:24:59 25 4
gpt4 key购买 nike

我有两个文件,它们都定义了一个类。

project/
__init__.py
thing.py
thinglist.py

thing.py定义一个类 Thing ,可以输出其他 Thing 的列表s:

# thing.py
from project.thinglist import ThingList
class Thing:
def make_more_things(self):
return ThingList(Thing(), Thing())

一个ThingListThing 的列表对象,它扩展了列表,并添加了一些其他函数:

# thinglist.py
from project.thing import Thing
class ThingList(list):
def __init__(self, *args):
list.__init__(self, *args)
assert all([isinstance(t, Thing) for t in self])
def some_other_method: pass

我们立即遇到了一个问题:循环依赖。 Thing需求ThingList为了构建ThingListsThingList需求Thing为了验证它是由且仅由 Thing 制成s。但Python不让我导入Thing进入thinglist.py .

为了解决这个问题,我可以将这两个类放入同一个文件中。但它们都相当冗长,为了我自己的理智,我真的不想这样做。我也可以省略 isinstance检查一下,但是我可能会遇到现在可以轻松解决的错误。

如何在不合并两个文件的情况下避免这种循环依赖?

最佳答案

如果指定容器数据类型的唯一目的是执行测试,您可以编写一个类似模板的类 Container ,其中包含所有逻辑(追加、类型检查),并且仅使用 Thing 对其进行子类化稍后在 thing.py 中作为容器类型。

例如,在 thinglist.py 中,您将拥有

class Container:

def __init__(self):
if not hasattr(self, 'type_ref'):
raise NotImplementedError("Type should be set in subclass")
self._data = []

def append(self, elt):
if not isinstance(elt, self.type_ref):
raise TypeError(f'Element should be of type {self.type_ref}')
self._data.append(elt)

... # rest of the logic

以及thing.py

from thinglist import Container

class ThingList(Container):
type_ref = Thing

关于python - 如何避免循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57495180/

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