1

我想在其方法之一中从同一类构造一个对象。但是,该方法位于不同的文件中。我该怎么做?

文件1.py

class MyClass():
    def __init__(self, i): 
        print(i)
    from file2 import my_fun

文件2.py

def my_fun(self):
    if i == 1:
        new_obj = MyClass(i + 1)

我收到以下错误:

NameError: name 'MyClass' is not defined
4

1 回答 1

1

file2file1.MyClass必须在某处导入。内部导入my_fun当然是可能的,但不可取。from file1 import MyClass在文件开头执行会导致循环依赖问题:可能MyClass在那个时候还没有执行,所以可能不存在。

选项1:

import file1

def my_fun(self):
    if i == 1:
        new_obj = file1.MyClass(i + 1)

在这种情况下,file1将引用正确的模块对象,即使它__dict__当时没有完全填充。到my_fun可以调用的时候,file1就已经加载完毕了。

选项 2:

class MyClass():
    def __init__(self, i): 
        print(i)

from file2 import my_fun
MyClass.my_fun = my_fun
del my_fun
def my_fun(self):
    if i == 1:
        new_obj = MyClass(i + 1)

from file1 import MyClass

在这个版本中,您可以在导入到另一个文件的事物的定义有机会运行之后放置所有导入语句。这一点都不优雅。

选项 3

def my_fun(self):
    from file1 import MyClass
    if i == 1:
        new_obj = MyClass(i + 1)

这是所有选项中最丑陋的。您可以通过删除file2对 的依赖来删除循环依赖file1。依赖是 独占的my_fun,直到运行时才表现出来,当它完全可解决时。这并不可怕,因为在第一次执行之后,导入基本上只是分配

MyClass = sys.modules['file1'].MyClass

TL;博士

通过仔细处理模块加载的执行路径,您有几种绕过循环依赖的方法。但是,此处显示的所有选项都是代码异味,您应该避免使用它们。它们表明应该以其他方式解决的模块之间不适当的耦合级别。

于 2021-07-24T03:20:01.727 回答