name 是内置变量,它表示的是当前所在模块的名字,同时还能反应一个包的结构。

a
├── b
│   ├── c.py
│   └── __init__.py
└── __init__.py

目录中所有的py文件的内容都为:

python(__name__)

模块名其实就是import时,要用到的名字。

如果一个模块直接被运行,则其没有包结构。其__name__值就为__main__。

python属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个 Python
源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python
用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。

举一个例子来说明一下,假设我们有一个 const.py 文件,内容如下:

PI = 3.14

def main():
    print "PI:", PI

main()

我们在这个文件里边定义了一些常量,然后又写了一个 main 函数来输出定义的常量,最后运行 main 函数就相当于对定义做一遍人工检查,看看值设置的都对不对。然后我们直接执行该文件(python const.py),输出:

PI: 3.14

现在,我们有一个 area.py 文件,用于计算圆的面积,该文件里边需要用到 const.py 文件中的 PI 变量,那么我们从 const.py 中把 PI 变量导入到 area.py 中:

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print "round area: ", calc_round_area(2)

main()

运行 area.py,输出结果:

PI: 3.14
round area:  12.56

可以看到,const 中的 main 函数也被运行了,实际上我们是不希望它被运行,提供 main
也只是为了对常量定义进行下测试。这时,if __name__ == '__main__' 就派上了用场。把 const.py 改一下:

PI = 3.14

def main():
    print "PI:", PI

if __name__ == "__main__":
    main()

然后再运行 area.py,输出如下:

round area:  12.56

再运行下 const.py,输出如下:

PI: 3.14

这才是我们想要的效果。

if __name__ == '__main__' 就相当于是
Python 模拟的程序入口。Python
本身并没有规定这么写,这只是一种编码习惯。由于模块之间相互引用,不同模块可能都有这样的定义,而入口程序只能有一个。到底哪个入口程序被选中,这取决于 __name__ 的值。

参考链接:

http://blog.konghy.cn/2017/04/24/python-entry-program/

http://www.tuicool.com/articles/jMzqYzF

http://stackoverflow.com/questions/4042905/what-is-main-py

最新文章

  1. ReflectUitls类的编写和对反射机制的解析
  2. 构建第一个maven工程
  3. [转载]WiFi有死角? 巧用旧无线路由器扩展覆盖
  4. JDBC Thin Driver 的formats三种格式
  5. 纯真IP数据库导入mysql
  6. LeetCode: Reverse Words in a String:Evaluate Reverse Polish Notation
  7. hdu2208之搜索
  8. HTML5管理与实际历史的分析(history物)
  9. 3505: [Cqoi2014]数三角形
  10. 理解Twisted与非阻塞编程
  11. 数据挖掘学习笔记--AdaBoost算法(一)
  12. springMVC源码分析--@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore
  13. SQLAchemy模块
  14. TCP-IP详解笔记3
  15. Sublime text 3搭建Python开发环境及常用插件安装
  16. [js]this关键字代表当前执行的主体
  17. ros navigation stack 各个包的作用
  18. Git 命令收集
  19. 20165326 java第三周学习笔记
  20. 逻辑卷(lv)管理(LVM)

热门文章

  1. jwt 在.net core 2.0的使用
  2. EF写in
  3. cocosBuilder生成cbbi文件,绑定到cocos2d-x
  4. C++STL之vector向量容器
  5. Java 类加载体系之 ClassLoader 双亲委托机制
  6. 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章
  7. 第46章 DCMI—OV5640摄像头—零死角玩转STM32-F429系列
  8. Swiper插件
  9. windows 编译安卓iconv 库
  10. lintcode_177_把排序数组转换为高度最小的二叉搜索树