为什么要写 __name__ == “__main__”

简介: if __name__ == "__main__" 模式在Python中用于区分模块是被直接运行还是被导入。通过这种模式,可以编写既可以作为独立脚本运行又可以作为模块导入的代码,从而提高代码的重用性和可维护性。

在Python中,__name__ == "__main__" 用于确定一个模块是作为脚本直接运行还是被另一个模块导入。

模块和脚本

  • 模块:模块是一个包含Python代码的文件,可以通过import语句在其他Python文件中导入。
  • 脚本:脚本是一个可以直接运行的Python文件。

__name__ 变量

  • __name__ 是一个特殊的内置变量。当Python解释器运行一个模块时,它会为该模块定义一些特殊变量,其中之一就是 __name__。
  • 如果模块是被直接运行的,那么 __name__ 的值将是 "__main__"。
  • 如果模块是被导入的,那么 __name__ 的值将是模块的名字(即模块文件名,不包括路径和文件扩展名)。

示例

考虑以下代码:

# example.py
def main():
    print("This is the main function.")
if __name__ == "__main__":
    main()

直接运行模块

如果你直接运行 example.py:

python example.py

输出将是:

This is the main function.

这是因为当 example.py 被直接运行时,__name__ 的值是 "__main__",因此 if 条件为真,main() 函数被调用。

导入模块

如果你在另一个文件中导入 example 模块:

# another_file.py
import example

没有输出。这是因为当 example 模块被导入时,__name__ 的值是 "example",而不是 "__main__",因此 if 条件为假,main() 函数不会被调用。

修改name

将__name__修改为文件的名称

# example.py
def main():
    print("This is the main function.")
if __name__ == "example":
    main()

这样在其他的文件中调用这个module时会输出内容。

本质和用途

  • 模块重用:通过使用 if __name__ == "__main__",你可以将模块中的代码组织成可重用的函数和类,同时保留一些只能在直接运行时执行的代码。这有助于代码的模块化和重用。
  • 测试代码:你可以在 if __name__ == "__main__" 块中包含测试代码。这些代码只有在直接运行模块时才会执行,而在导入模块时不会执行。

使用main的用途

假设有两个文件 module.py 和 main.py:

# module.py
def function():
    print("Function in module.")
if __name__ == "__main__":
    print("Module is being run directly.")
else:
    print("Module has been imported.")
# main.py
import module
module.function()

运行 module.py:

python module.py

输出:

Module is being run directly.

运行 main.py:

python main.py

输出:

Module has been imported.
Function in module.

使用example的用途

在Python中,__name__ 变量的常用值有 "__main__" 和模块的名称(例如 "example")。虽然 __name__ == 'example' 这种写法并不常见,但它确实可以用于一些特定场景。以下是一些可能的使用场景:

特定模块初始化

某个特定模块被导入时执行一些初始化代码。例如:

# module.py
def initialize():
    print("Initializing module...")
if __name__ == "module":
    initialize()

在这种情况下,如果模块 module 被导入,初始化代码将会被执行。

总结

if __name__ == "__main__" 模式在Python中用于区分模块是被直接运行还是被导入。通过这种模式,可以编写既可以作为独立脚本运行又可以作为模块导入的代码,从而提高代码的重用性和可维护性。

相关文章
|
6月前
|
程序员 C语言 开发者
int main() 作用详解
int main() 作用详解
457 0
|
6月前
! [ ] == ! [ ] 和 ! [ ] == [ ] 结果是什么? 为什么?
! [ ] == ! [ ] 和 ! [ ] == [ ] 结果是什么? 为什么?
41 0
C#—Main方法
今天在敲委托代理第三个例子的时候遇到了这样的问题
|
C++
自定义C++ void swap(int& ra, int * pb)函数
这是一个软考和c++考试的一个经典面试题,给出5空,然后了,检测swap函数怎么写,主要考察的就是对于指针与引用的理解,难点为,很多人都不知道第三空填啥,因为我们通常写的c++的swap函数没有这一行,下面给出我的答案。
112 0
(*void(*)())0)()和void(*signal(int, void(*)(int)))(int); 讲解
(*void(*)())0)()和void(*signal(int, void(*)(int)))(int); 讲解
133 0
_main函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ)
_main函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ)
_main函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ)
|
Java
深入理解main方法
深入理解main方法
217 0
深入理解main方法
|
Unix Linux C++
C/C++---关于int main( int argc, char* argv[] ) 中arg和argv参数的解析
C/C++---关于int main( int argc, char* argv[] ) 中arg和argv参数的解析
485 0