在 Python 中导入时遇到问题

Trouble with importing in Python

我正在尝试创建一个需要主 class 变量的模块,因此我将所述变量导入模块,但是当我尝试通过将其导入主 class,它说它不能导入它。

这似乎是因为我在导致问题的新模块中导入了 main class,因为每当我删除导入时,它都可以工作,但它无法再从 main class 需要运行。

主要class:

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task()

新模块:

from Main import variable1, variable2

class Mod:
    def task(self):
        print(variable1+variable2)

当我 运行 主要 class 我得到这个:

Traceback (most recent call last):
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
ImportError: cannot import name 'Mod' from 'Mod' (D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py)

当我 运行 新模块时,我得到了这个:

Traceback (most recent call last):
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py", line 1, in <module>
    from Mod import Mod
  File "D:\.here\Computer Science\Computer Science Stuff\Python Projects\Mod.py", line 1, in <module>
    from Main import variable1, variable2
ImportError: cannot import name 'variable1' from 'Main' (D:\.here\Computer Science\Computer Science Stuff\Python Projects\Main.py)

我不知道为什么会这样。这与我在 Java.

中所做的事情相矛盾

如果不通过导入,我如何才能引用存储在主 class 中的全局变量?

您可以更新 Mod.task() 以接收两个额外的参数,因此您会得到:

def task(self, a, b):
    print(a + b)

然后,在主要部分,您只需说:

mod.task(variable1, variable2)

除了将 Mod 导入您的主 class

外,无需导入

您在这里的问题称为“circular dependency”。 Main.py 正在尝试从 Mod.py 导入 class,但在此之前,Mod 必须从 Main.py 导入一些变量,但在此之前。 ..

通常,解决循环依赖的方法是重新组织程序的布局方式。例如,您可以参数化 Mod,使其不再依赖于 Main。例如:

Main.py:

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task(variable1, variable2)

Mod.py:

class Mod:
    def task(self, a, b):
        print(a + b)

或者,您可以将 variable1variable2 存储在不同的文件中。找到最佳解决方案将取决于什么对您的程序最有意义。

这是循环依赖造成的

如上述答案所述,解决循环依赖的方法是重新组织程序的布局方式。 使用 参数

尽管如此,一个简单的解决方法是 内联导入

Main.py

from Mod import Mod

variable1=5
variable2=3

mod=Mod()

mod.task()

Mod.py


class Mod:
    def task(self):
        from Main import variable1, variable2
        print(variable1+variable2)

遵循 DRY 原则。不要重复自己。

将 "Main" 变量导入 Mod,导致循环依赖。你必须不惜一切代价避免的事情。使用面向对象编程来解决您的问题。

解题步骤:

  1. 删除Main的导入。
  2. 更改任务函数以允许传递两个参数。应该是这样的

    def task(self, variable1, variable2):
       print(variable1 + variable2)
    

    #变量1和2可以任意命名

  3. 在主脚本中,调用函数:

    Mod.task(variable1, variable2)
    

    这里必须使用变量名,因为你现在调用的是你在Main中给出的定义。

我不明白你的意思 Java 这样的事情可以做.. 但是在 python 中有可能遵守循环引用模块的主体必须能够在不访问其他相关模块内容的情况下执行的规则。
所以你可以这样做:

# cat Main.py
import Mod
var1=2
var2=3
if __name__ == '__main__':
    mod=Mod.Mod()
    mod.task()
# cat Mod.py
import Main
class Mod(object):
    def task(self):
        print(Main.var1+Main.var2)

例如。或在导入链成功后使用您调用的函数处理模块的初始化。
无论如何,大多数时候最好避免这样的事情,只需初始化您 类 并使用参数调用函数。