在具有循环依赖性的文件之间共享全局对象
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 module
或from module import Class
逐行声明运行对应的模块,并将模块命名空间中的所有对象加载到内存中。然而,模块中的每个名称都是独立存在的(毕竟这是模块的目的)。所以 some_class.py
中的 global_object
与 run.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
我有一个使用 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 module
或from module import Class
逐行声明运行对应的模块,并将模块命名空间中的所有对象加载到内存中。然而,模块中的每个名称都是独立存在的(毕竟这是模块的目的)。所以 some_class.py
中的 global_object
与 run.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