同一目录中有两个模块。你知道吗
我使用的是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如何处理两个模块相互导入的情况感到困惑。你知道吗
有人对此有想法吗?你知道吗
您将得到两行输出,因为您执行了两次a.py:一次作为主程序,一次当它被导入到b中时。避免循环导入,并且绝对不要导入主程序。你知道吗
导入主程序的另一个副作用是:现在这个程序中有两个名为
orig
的类。你知道吗第二个@TokenMacGuy和@Ned:如果将a.py的结尾替换为:
你只会得到一个“你好”。你知道吗
而且,事实上:避免循环依赖!你知道吗
当您直接运行python脚本时,就像使用
python a.py
一样,python解释器不会猜测该文件的模块路径应该是什么;它只是创建一个名为__main__
的模块并运行它。你知道吗另一个微妙之处是,每次python遇到导入时,它首先创建模块并将其存储在
sys.modules
中,以便同一模块的所有其他导入都生成相同的模块对象。只有在剩下breadcrumb之后,它才会开始执行实现该模块的python代码。你知道吗下面是一步一步在shell控制台python中键入
python a.py
的过程 创建__main__
模块并开始计算该文件。你知道吗好的,第一件事就是
a.py
导入一些东西。它以前从未被导入过,所以它搜索路径并找到b.py
;因为我们仍在尝试导入另一个文件,所以我将缩进一点来说明这一点。你知道吗在
b.py
中发生的第一件事是它试图导入a
。但是a
也从未被导入;当python搜索路径时,它会找到a.py
看起来很熟悉;但是b已经导入了;这个
b
将是同一个(仍在导入过程中!你知道吗好的。一个类被创建、实例化,并出现一些输出;
a
现在完成了导入;这很好,因为b
使用了from导入,这意味着orig
现在需要存在,否则导入将失败。你知道吗b
猴斑a.orig
(注:不是__main__.orig
)。b
也已完成导入。你知道吗现在
__main__
正在定义一个类,实例化它并打印一些输出。还要注意,这是类__main__.orig
的定义,而不是修改的a.orig
b。你知道吗希望能消除一些混乱。你知道吗
相关问题 更多 >
编程相关推荐