Python中循环导入方法的奇怪输出

2024-04-18 05:40:57 发布

您现在位置:Python中文网/ 问答频道 /正文

同一目录中有两个模块。你知道吗

我使用的是python3.2

一个是a.py这样:

import b
class orig:
    def test(self):
        print("hello")


o = orig()
o.test()

另一个是b.py这样:

from a import orig
orig.test=lambda self: print("wrong")

当我这样运行命令时:

python a.py

我希望在输出中只看到一个hello,但是在输出中看到两个hello。每个hello在一个单独的行中。你知道吗

另外,我对python如何处理两个模块相互导入的情况感到困惑。你知道吗

有人对此有想法吗?你知道吗


Tags: 模块lambdafrompytestimport命令self
3条回答

您将得到两行输出,因为您执行了两次a.py:一次作为主程序,一次当它被导入到b中时。避免循环导入,并且绝对不要导入主程序。你知道吗

导入主程序的另一个副作用是:现在这个程序中有两个名为orig的类。你知道吗

第二个@TokenMacGuy和@Ned:如果将a.py的结尾替换为:

if __name__ == "__main__":
    o = orig()
    o.test()

你只会得到一个“你好”。你知道吗

而且,事实上:避免循环依赖!你知道吗

当您直接运行python脚本时,就像使用python a.py一样,python解释器不会猜测该文件的模块路径应该是什么;它只是创建一个名为__main__的模块并运行它。你知道吗

另一个微妙之处是,每次python遇到导入时,它首先创建模块并将其存储在sys.modules中,以便同一模块的所有其他导入都生成相同的模块对象。只有在剩下breadcrumb之后,它才会开始执行实现该模块的python代码。你知道吗

下面是一步一步在shell控制台python中键入python a.py的过程 创建__main__模块并开始计算该文件。你知道吗

the file being parsed
  |
  |       the module being imported       
  |         |     
./a.py  __main__  1:  import b

好的,第一件事就是a.py导入一些东西。它以前从未被导入过,所以它搜索路径并找到b.py;因为我们仍在尝试导入另一个文件,所以我将缩进一点来说明这一点。你知道吗

    ./b.py  b  1:  from a import orig

b.py中发生的第一件事是它试图导入a。但是a也从未被导入;当python搜索路径时,它会找到a.py

        ./a.py  a  1:  import b

看起来很熟悉;但是b已经导入了;这个b将是同一个(仍在导入过程中!你知道吗

        ./a.py  a  2:  class orig:
        ./a.py  a  3:      def test(self):
        ./a.py  a  4:          print("hello")
        ./a.py  a  5:  
        ./a.py  a  6:  
        ./a.py  a  7:  o = orig()
        ./a.py  a  8:  o.a()

好的。一个类被创建、实例化,并出现一些输出;a现在完成了导入;这很好,因为b使用了from导入,这意味着orig现在需要存在,否则导入将失败。你知道吗

    ./b.py  b  2:  orig.test=lambda self: print("wrong")

b猴斑a.orig(注:不是__main__.orig)。b也已完成导入。你知道吗

./a.py  __main__  2:  class orig:
./a.py  __main__  3:      def test(self):
./a.py  __main__  4:          print("hello")
./a.py  __main__  5:  
./a.py  __main__  6:  
./a.py  __main__  7:  o = orig()
./a.py  __main__  8:  o.a()

现在__main__正在定义一个类,实例化它并打印一些输出。还要注意,这是类__main__.orig的定义,而不是修改的a.origb。你知道吗

希望能消除一些混乱。你知道吗

相关问题 更多 >