【发布时间】:2020-04-20 20:21:50
【问题描述】:
你好!
通常,循环导入意味着代码中存在结构问题,但我看不到任何其他方法可以解决此问题。 这是我目前的情况:
我有两个班级:Project 和 Preset
Project 有一个方法可以生成Preset,类似于:
from preset import Preset
class Project():
def __init__(self, project):
self._project_name = project
def get_preset(self, preset_name):
return Preset(preset_name, self._project_name)
然后,我有 Preset 类,它还需要一个 Project 名称来初始化。比如:
from project import Project
class Preset():
def __init__(self, preset_name, project_name):
self._project = Project(project_name)
一般来说,我将始终通过Project 类使用get_preset 方法创建Presets,但我还想提供直接创建Preset 的可能性,而不必创建Project首先。
有摆脱这种循环递归的想法吗?
谢谢!!
【问题讨论】:
-
将
get_preset从Project移动到Preset并在Project.get_preset内调用Preset.get_preset(preset_name)? -
我已经更新了代码示例,因为它是错误的。
Preset初始化需要preset_name和preset所属的project_name,所以我不能这样解决:(谢谢!!! -
当您访问项目的预设时,它会在其中创建一个带有 new 项目的预设,而不是引用与其关联的实际项目,这似乎很糟糕。但撇开这些不谈,循环引用仍然很糟糕。
Preset需要Project提供什么,Project需要Preset提供什么?如果其中任何一个的答案是“无”,则您没有逻辑依赖,因此您应该删除导入依赖。否则,找出改变其中一个答案的方法。 :) -
我已经将
Project对象传递给Preset构造函数。无论如何,由于类型提示,我仍然得到循环依赖。我修复了:if typing.TYPE_CHECKING: import Preset。我一点也不喜欢,但是……谢谢大家!
标签: python circular-dependency