跨循环依赖的文件共享全局对象

时间:2017-12-26 01:10:55

标签: python python-import

我有一个使用类的全局对象,该类使用全局对象。我怎样才能以干净的方式正确地进口货物

我现在有:

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()方法中,但在我看来它是不干净的代码。有没有更好的方法

1 个答案:

答案 0 :(得分:1)

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

如果你想维护这个设置,那么一个选项就是明确地将global_object中的self Global_class传递给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