__main__是Python中一个特殊的变量或模块名,通常用于判断一个模块是独立运行还是被导入运行。当一个Python文件被直接执行时,其内部的__name__变量会被设置为__main__,从而可以执行一些仅在该文件被直接执行时需要执行的代码,或者做一些特殊的处理。
一、主模块执行代码
在一个Python文件的最顶层,编写一些我们只希望在该文件被直接执行时执行的代码,可以将这些代码放在一个if __name__ == '__main__'的条件语句块中。当该文件被直接执行时,if条件会成立,其中的代码就会被执行,如果该文件被导入到其他文件中使用,则不会执行这部分代码。
# 示例代码 def func1(): print("这是一个函数") def func2(): print("这也是一个函数") if __name__ == '__main__': print("这是在主模块中运行的代码") func1() func2()
上述示例代码中,func1()和func2()是两个函数,在if条件成立时会被执行。对于上述代码,如果直接运行该文件,则会执行if条件语句块中的代码,打印出相应的信息和函数调用结果。如果这个文件被导入到其他文件中使用,则不会执行if条件语句块中的代码,只能使用导入后的函数。
二、模块作为库导入
在Python中,我们可以将一个Python文件作为一个库导入到其他文件中使用。当文件被导入时,__name__变量会被设置为模块的名字(文件名去除.py后缀),而不是设置为__main__。这种情况下,我们可以在该模块文件中编写一些可供其他文件使用的函数、类或变量。
# mymodule.py示例代码 def func(): print("这是一个函数") class MyClass: def __init__(self): print("这是一个类") if __name__ == '__main__': print("这是在主模块中运行的代码") func() obj = MyClass()
# main.py示例代码 import mymodule print("这是主模块") mymodule.func() obj = mymodule.MyClass()
上述示例中,mymodule.py是一个模块文件,其中包含了一个函数和一个类。在main.py中,我们通过import语句将mymodule模块导入,并使用它的函数和类。当main.py被直接执行时,__name__变量会被设置为__main__,而mymodule.py中的if条件不成立,所以其中的代码不会被执行,只会执行main.py中的代码。
三、主模块判断
在编写可复用的模块时,有时候我们希望模块既可以作为独立的脚本被执行,又可以作为一个库被导入到其他地方使用。为了达到这个目的,可以在模块中同时使用__name__和__main__两个变量进行判断。
# mymodule.py示例代码 def func(): print("这是一个函数") if __name__ == '__main__': print("这是在主模块中运行的代码") func() else: print("这是在其他模块中导入运行的代码")
上述示例代码中,当mymodule.py被直接执行时,__name__变量被设置为__main__,if条件成立,则执行if块中的代码。如果mymodule.py被导入到其他模块中使用,__name__变量不等于__main__,则执行else块中的代码。
通过合理使用__name__和__main__变量,我们可以在Python程序中判断模块的运行方式,并做出不同的处理。这样可以使模块更加灵活,既可以作为独立脚本使用,又可以作为库被导入到其他地方使用。