[英]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 支持的一些范例中,例如过程编程。
执行允许该模块的设计者考虑不同的用例。 该模块可以作为脚本导入或运行。 为了适应这一点,可能需要重新定义一些函数、类或方法。 例如,一个脚本可以将 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
文件。
根据python
对python的创建者模块机制的采访,受到Modula-2
和Modula-3
语言的影响。 所以也许正确的问题是为什么上述语言的创建者选择以这种方式实现模块?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.