在具有循环依赖性的文件之间共享全局对象

Sharing a global object across files with circular dependencies

我有一个使用 class 的全局对象,而 class 使用该全局对象。我怎样才能以干净的方式正确放置导入

我现在有:

run.py(我的文件运行)

from global_class import Global_class
global_object = Global_class()
global_object.create_some_object()

global_class.py

from some_class import Some_class
class Global_class:
    def __init__(self):
        self.name = 'my_name'

    def create_some_object(self):
        self.some_object = Some_class()

some_class.py

class Some_class:
    def __init__(self):
        print(global_object.name)

我现在如何访问 Some_class 中的 global_object?如果我输入:

from run import global_object 

它创建了一个循环依赖,然后崩溃了。我想到的一种可能的方法是将 some_class 导入到 Global_class::create_some_object() 方法中,但在我看来它是不干净的代码。有没有更好的方法

任何pythonimport modulefrom module import Class逐行声明运行对应的模块,并将模块命名空间中的所有对象加载到内存中。然而,模块中的每个名称都是独立存在的(毕竟这是模块的目的)。所以 some_class.py 中的 global_objectrun.py 中的 global_object 是完全分开的。当解释器在 some_class.py 中看到这个名称时,它将在本地和全局命名空间中查找(使用代表本地、封闭、全局和内置的 LEGB 规则)。但是这里没有对 global_object 的引用,它在 calling 模块中存在。出于同样的原因,您建议将 some_class import 语句放在方法 create_object() 中也不起作用。正如您所发现的,您无法在 some_class 中导入 global_object,因为它将再次需要 运行 run.py 从而创建一个循环。

如果您想维护此设置,那么一个选择是显式地将 Global_class 中的 self global_object 传递给 Some_class() 构造函数,如下所示

#run.py                                                              
from global_class import Global_class
global_object = Global_class()
global_object.create_some_object()

#global_class.py
from some_class import Some_class
class Global_class:
    def __init__(self):
        self.name = 'my_name'

    def create_some_object(self):
        self.some_object = Some_class(self) #self -> global_object

#some_class.py
class Some_class:
    def __init__(self, global_object):
        print(global_object.name)

$ python run.py 
my_name