零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门
学习过 C 语言或者 Java 语言的盆友应该都知道程序运行必然有主程序入口 main 函数,而 Python 却不同,即便没有主程序入口,程序一样可以自上而下对代码块依次运行,然后 Python 不少开源项目或者模块中依然存在 __name__ == “__main__” 这种写法,具体是上面意思呢?
一.简介
1.__name__
__name__ 是 Python 的内置属性,是系统全局变量!每一个 py 文件都有一个属于自己的__name__:
如果 py 文件作为模块被导入(import),那么 __name__ 就是该 py 文件的文件名(也称 模块名);
如果 py 文件直接运行时(Ctrl+Shift+F10),那么 __name__ 默认等于字符串”__main__”;
举个简单的例子:假如你名字是张三
在朋友眼中,你是张三
(__name__ == '张三')
;在你自己眼中,你是你自己
(__name__ == '__main__')
2.’__main__’
‘_ _main_ _’ 实际上就是一个字符串,用来鉴别程序入口,没有太多花里胡哨的东西.
3.__name__ == ‘__main__‘
当 .py 文件被直接运行 (Ctrl+Shift+F10) 时, if __name__ == ‘__main__’ 之下的代码块将被运行,该语句就相当与 Python 的 main 主函数入口,示例代码如下:
a.新建一个 my_name.py 文件,作为模块文件:
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python __name__ == ‘__main__’.py
@Time:2021/04/24 08:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
"""
# 定义一个函数并打印 __name__
def prit_name():
print("my_name.py __name__:", __name__)
if __name__ == "__main__":
prit_name()
b.新建一个 python_main.py 文件,作为启动文件 (Ctrl+Shift+F10):
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python __name__ == ‘__main__’.py
@Time:2021/04/24 08:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
"""
# 导入 my_name 模块
import my_name
# 定义一个函数并打印 __name__
def prit_name():
my_name.prit_name()
print("python_main.py __name__:", __name__)
if __name__ == "__main__":
prit_name()
'''
输出结果:
my_name.py __name__: my_name
python_main.py __name__: __main__
'''
由此可见,作为启动文件 python_main.py ,该文件的内置属性 __name__ 等于 ‘__main__’,而 my_name.py 作为导入模块,该模块的 __name__ 等于文件名(也称模块名字),所以 my_name.py 中的 表达式 if __name__ == ‘__main__’ 并不成立!
当直接将 my_name.py 作为启动文件时 (Ctrl+Shift+F10),输出:
my_name.py __name__: __main__
总结:
如果 py 文件作为模块被导入(import),那么 __name__ 就是该 py 文件的文件名(也称 模块名);
如果 py 文件直接运行时(Ctrl+Shift+F10),那么 __name__ 默认等于字符串 ‘__main__‘ ;
二.作用
1.__name__ == ‘__main__‘ 作为启动 py 文件的 main 函数入口;
2.一个项目中必然会包含多个模块文件,每个模块文件在自己写完代码之后会做一些简单的测试用于检测 bug 或者 对自己的函数调用写一个简单的示例,而恰到好处的是:__name__ == ‘__main__‘ 既不会影响你的测试代码,也不会影响别人调用你的接口函数;
三.猜你喜欢
- Python for循环
- Python 字符串
- Python 列表list
- Python 元组tuple
- Python 字典 dict
- Python 条件推导式
- Python 列表推导式
- Python 字典推导式
- Python 函数声明和调用
- Python 不定长参数 *argc/**kargcs
- Python 匿名函数 lambda
- Python return 逻辑判断表达式
- Python 字符串/列表/元组/字典之间的相互转换
- Python 局部变量和全局变量
- Python type 函数和 isinstance 函数区别
- Python is 和 == 区别
- Python 可变数据类型和不可变数据类型
- Python 浅拷贝和深拷贝
暂无评论内容