当打开一个Python文件时,通常是.py作为扩展名,我们通常会在代码的最后面看到If __name__ == “__main__”:这条语句,这条语句的主要作用就是当该文件直接被使用时,就会__name__就等于__main__,当作为模块被调用时,__name__就不等于__main__了,这样我们就可以在模块中添加自己的打印调试信息。首先,我们可以看下面的的一个例子。
例子1:我们定义了一个自己的简单模块,这个模块的名字是my_square.py,就是计算一个数的平方。
点击(此处)折叠或打开
#!/usr/bin/python
def square(x):
y = x * x
return y
if __name__ == "__main__":
print "my math module square(5)=",square(5);
该文件直接运行时会打印输出,但是当使用import导入到另一个模块时,该语句并不会输出
我们直接运行该程序,可以查看该运行结果。
点击(此处)折叠或打开
root@team:~/python# my_square.py
my math module square(5)= 25
直接运行该模块可以看到if条件的判断是成立的,也就是这里name为__main__,可以添加自己的调试信息。我们再写一个简单的程序,在该程序中使用import导入我们刚才写的square模块。程序的名字为test_name_main.py。
点击(此处)折叠或打开
root@team:~/python# cat test_name_main.py
#!/usr/bin/python
import my_square;
print "In caller,Call square from my_square ,square(8)",my_square.square(8);
print "my_square module be imported,my_square module name =",my_square.__name__;
print "module name =",__name__;
我们查看一下运行结果:
点击(此处)折叠或打开
root@team:~/python# ./test_name_main.py
In caller,Call square from my_square ,square(8) 64
my_square module be imported,my_square module name = my_square
module name = __main__
通过运行结果我们可以看到在my_square.py文件中的if判断条件不成立,所以print "my math module
square(5)=",square(5);并没有打印出来,我们使用my_square获取其__name__属性,输出的结果为my_square。
因此,我们可以使用该特性在我们自己的模块中添加一下调试信息,这些调试信息仅仅当直接运行是才会打印出来,但作为模块导入到另一个文件时,并不会被打印出来。
在Python2.7.2 documentation文件中我们可以看到对__name__的解释。__name__is to be set to the name of
the module,
在Python2.7.2 documentation文档中The Python
Language Reference章节中Data model中也有对__name__的介绍:
__name__is the method name (same as im_func.__name__);
__name__is the function’s name
Predefined (writable)
attributes: __name__ is the module’s name
Special attributes: __name__ is the class name
总之,通过上面的官方解释可知,__name__在不同的语义环境中可以表示不同的名字。如果在Class中就是类的名字,如果在函数中就是函数的名字,在模块中就是模块名字。在Python2.7.2 documentation文档中,有对__main__的解释
The namespace for a module is
automatically created the first time a module is imported. The main module for
a script is always called __main__.
对于Python程序语言来说,我们更多情况下是使用模块的概念,也就是在写Python程序中使用import导入一个模块,在Python的库中有许多写好的模块可以直接使用。所以,当一个模块被第一次导入时,就会自动创建一个命名空间,此时脚本的主模块的名字始终是__main__。其实对于Python程序分为直接执行和作为模块调用执行,例如上面的my_square.py就是作为模块调用执行的,在test_name_main.py。
通过上面的示例程序可以看到:
(1)my_square.py作为自身直接运行时,__name__对应的就是__main__,
(2)当my_square.py作为一个模块被别人调用时,对应的模块my_square.py的模块名字为my_square.
示例二:
点击(此处)折叠或打开
Example? 8.2.? Using a module's __name__
#!/usr/bin/python
# Filename: using_name.py
if __name__ == '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module
也可以说明上面的问题。
总之,__name__表示的是模块或者函数或者类的名字。如果是.py自身执行时,__name__就等于__main__,如果是作为模块导入到.py文件后,模块的名字就是模块本身的名字。
参考文献: http://www.crifan.com/python_detailed_explain_about___name___and___main__/