繁体   English   中英

当您只是从其他地方(例如 main.py)导入一段 test.py 时,为什么要运行 python 文件(例如 test.py)的其他代码行?

[英]Why do you run other lines of codes of a python file(say test.py) when you are just importing a piece of test.py from somewhere else (say main.py)?

我有两个 python 文件。 一个是我执行的 main.py。 另一个是test.py,我从中在main.py中导入了一个class。 这是 main.py 的示例代码:

from test import Test
if __name__ == '__main__':
    print("You're inside main.py")
    test_object = Test()

而且,这里是 test.py 的示例代码:

class Test:
    def __init__(self):
        print("you're initializing the class.")
if __name__ == '__main__':
    print('You executed test.py')
else:
    print('You executed main.py')

最后,这里是 output,当你执行 main.py 时:

You executed main.py
You're inside main.py
you're initializing the class.

从上面的输出顺序可以看出,一旦导入文件的一部分,整个文件就会立即执行。 我想知道为什么? 这背后的逻辑是什么? 我来自 java 语言,其中所有文件都包含一个同名的 class。 我只是很困惑为什么 python 会这样。

任何解释都会被应用。

怎么了?

当您导入测试模块时,解释器会运行它,逐行执行。 由于if __name__ == '__main__'计算结果为 false,因此它执行 else 子句。 在此之后,它继续超出 main.py 中的from test import Test

为什么 python 会执行导入的文件?

Python 是一种解释型语言。 被解释意味着程序当时被读取和评估一行。 通过导入的模块,解释器需要评估每一行,因为它无法辨别哪些行对模块有用。 例如,一个模块可能有需要初始化的变量。

Python 旨在支持多种范式。 此行为用于 python 支持的一些范例中,例如过程编程。

执行允许该模块的设计者考虑不同的用例。 该模块可以作为脚本导入或运行。 为了适应这一点,可能需要重新定义一些函数、类或方法。 例如,一个脚本可以将 output 非关键错误发送到终端,同时将一个导入模块发送到日志文件。

为什么要指定要导入的内容?

假设您要导入两个模块,都带有一个测试类。 如果这些模块中的所有内容都被导入,那么我们的程序中只能存在一个版本的测试类。 我们可以使用不同的语法来解决这个问题。

import package1
import package2

package1.Test()
packade2.Test()

或者,您可以使用as -keyword 重命名它们。

from package1 import Test
from package2 import Test as OtherTest

Test()
OtherTest()

将所有内容转储到全局命名空间(即from test import * )会污染程序的命名空间,其中包含许多您可能不需要并且无意覆盖/使用的定义。

其中所有文件都包含一个同名的 class

python中没有这样的要求,例如,您可以将多个类、函数、值放在单个.py文件中

class OneClass:
    pass
class AnotherClass:
    pass
def add(x,y):
    return x+y
def diff(x,y):
    return x-y
pi = 22/7

是合法的python文件。

根据pythonpython的创建者模块机制的采访,受到Modula-2Modula-3语言的影响。 所以也许正确的问题是为什么上述语言的创建者选择以这种方式实现模块?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM