【python】if __name__==‘__mian__‘ 如何理解,原理及作用

2023-11-01

1、什么是 name
1)为什么使用__name__属性

Python解释器在导入模块时,会将模块中没有缩进的代码全部执行一遍(模块就是一个独立的Python文件)。开发人员通常会在模块下方增加一些测试代码,为了避免这些测试代码在模块被导入后执行,可以利用__name__属性。

2) __name__属性

name__属性是Python的一个内置属性,记录了一个字符串。若是在当前文件,name 是__main。在hello文件中打印本文件的__name__属性值,显示的是__main__

若是导入的文件,name__是模块名(文件名,有.py后缀的)
test文件导入hello模块,在test文件中打印出hello模块的__name__属性值,显示的是hello模块的模块名在这里插入图片描述
因此__name
== ‘main’ 就表示在当前文件中,可以在if name == ‘main’:条件下写入测试代码,如此可以避免测试代码在模块被导入后执行。

2、模块导入

我们知道,当我们把模块A中的代码在模块B中进行import 导入A时,只要B模块代码运行到该import语句,模块A的代码会被执行。
模块A:# 模块A

#模块A
a='我是模块A!'
print('你好',a)
#模块B
from modle import A
b='哈哈,我是模块B~~'
print('你好',b)
#运行模块B时,输出结果
你好,我是模块A!
你好,哈哈,我是模块B~~

如果在模块A中,我们有部分的代码不想在被导入到B时直接被运行,但在直接运行A时可直接运行,那该怎么做呢?那就可以用到“if name=='main':这行代码了,我们对上面用到的A模块代码进行修改:

#模块A
a='我是模块A!'
if __name__=='__main__':
	print('你好',a)

B模块不做修改,直接执行B模块,输出结果如下:

#修改后运行模块B时,输出结果
你好,哈哈,我是模块B~~

综上:A模块中的a的值就没有再被输出了。所以,当你要导入某个模块,但又不想改模块的部分代码被直接执行,那就可以这一部分代码放在“if name==‘main’:”内部

3、“name”与“main

看到现在也许心中还是疑惑,那么现在我们来说一说“if__name__==‘main’:”的原理。“name”是Python的内置变量,用于指代当前模块。我们修改上面用到的A模块和B模块,在模块中分别输出模块的名称:
模块A:

# 模块A
print('你好,我是模块A……')
print('模块A中__name__的值:{}'.format(__name__))
print('-------------------------')
# 模块B
from model import A
print('你好,我是模块B……')
print('模块B中__name__的值:{}'.format(__name__))

执行A模块时,输出结果:

你好,我是模块A……
模块A中__name__的值:__main__
-------------------------

执行B模块时,输出结果:

你好,我是模块A……
模块A中__name__的值:model.A
-------------------------
你好,我是模块B……
模块B中__name__的值:__main__

发现神奇之处了吗?当哪个模块被直接执行时,该模块“name”的值就是“main”,当被导入另一模块时,“name”的值就是模块的真实名称。所以,当运行“if namemain’:”语句时,如果当前模块时被直接执行,name__的值就是__main,条件判断的结果为True,“if namemain’:”下面的代码块就会被执行。

参考:https://www.zhihu.com/question/49136398/answer/114438004

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python】if __name__==‘__mian__‘ 如何理解,原理及作用 的相关文章

随机推荐

  • 【百占百胜】-三创比赛,将form表单数据封装成对象使用ajax方式传到后台

    大家好 我是被白菜拱的猪 一个热爱学习废寝忘食头悬梁锥刺股 痴迷于girl的潇洒从容淡然coding handsome boy 解决了上一问题 这不又来一个问题 真是问题接着问题 问题无穷尽也 使用ajax将form表单数据封装成对象发送到
  • linux下 source ~/.bashrc文件修改后无效的原因

    linux下通过vim bashrc修改数据比如数据库连接 export CONN STRING postgres username password 127 0 0 1 db sslmode disbale 保存退出后 直接用source
  • GD32上SFUD万能Flash驱动移植

    GD32上SFUD万能Flash驱动移植 移植前提 下载源码 测试效果 移植过程 添加文件到工程目录 keil项目中添加如下文件到工程 设置头文件包含路径 修改sfud port c文件 修改sfud cfg h文件 添加获取初始化状态 可
  • MySQL语句备忘

    MySQL事务随时查看 打开事务随时查看 有效范围当前窗口 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SQLyog直接点击表在窗口查看即可 比较方便 Navicat需要
  • JavaScript正则表达式

    正则表达式大白话就是一个能判定你的输入内容是否符合设计者规定的一个式子 作用 1 测试字符串是否合规 被用来检测前端输入的字段是否符合要求 常见的场景是注册时输入账号 密码 邮箱等的测试 2 替换某确定的文本 通过js批量替换某个已存在的文
  • R语言学习笔记8

    15 概率 贝叶斯概率 基于当前情形的个人判断使用先验知识来给概率赋值 条件概率 一个事件在另一个发生的事件下发生概率 交集 并集 补集 随机变量 一个偶然的机或者随机出现特定结果的变量 概率分布 将随机变量与定义概率函数相联系是有意义的
  • 头条巨量快手广点通等平台APP&API回传事件注册激活-转化联调-API对接原理代码分析和功能实现

    2022年最新的头条巨量快手广点通等各推广平台APP API回传事件 转化联调注册激活 API对接原理代码分析和功能实现 在商户推广管理当中 经常碰到 需要将用户行为数据回传给推广平台 做转化追踪 事件回传 需要把用户行为数据回传给诸如巨量
  • argsort()函数

    a 6 4 5 b a argsort 1 2 0 意思是 a 1 lt a 2 lt a 0 解释如下 数组a排序后为a1 4 5 6 a argsort返回数组a1中的元素在原数组a中的索引 如何返回数组a中的元素在a1中的索引 2 0
  • LVGL笔记13–lv_led指示灯

    LVGL笔记13 lv led指示灯 LV LED控件就是一个简单的指示灯 在屏幕上绘制一个LED灯样式的图形 这个外形可以通过LV style来修改 通常设置为圆形或小矩形 led灯控件具有0 255级的可调亮度属性 设置为0时代表最暗
  • Python3.11教程4:异常处理

    文章目录 九 异常处理 9 1 异常堆栈跟踪 9 2 异常处理的基本语法 9 3 异常类及异常处理机制 9 4 自定义异常类 9 5 raise触发异常 及其与except的区别 9 6 异常链 9 7 处理多个不相关的异常 9 8 用注释
  • Web目录文件扫描程序(python)

    使用方法 首先找个网站 我们可以看到URL中有php后缀名 说明该网站为php网站 输入参数 URL 文件类型 线程数 即可扫出目录文件 验证一下 访问成功 代码 环境 pycharm python3 9 文件结构 dics文件夹下为各个后
  • 重庆三峡学院计算机英语期末考试,英语语言学试题B卷及答案(重庆三峡学院)

    语言学 英语语言学试题B卷及答案 重庆三峡学院 I Define the following linguistic terms 2 10 20 1 government 2 exocentric construction 3 complem
  • gdb之info/show命令

    一 gdb命令 相对于常见和常用的backtrace break watch step之类的指令来说 这两个都是相对比较小众的功能 只管来说 小众的功能就是使用的人比较少的功能 而使用的比较少的原因也可能是多方面的 一个可能的原因就是大部分
  • 并发程序设计

    ComputeTask h void executeComputeTask ComputeTask c include ComputeTask h include
  • 书摘】程序员成长的10个阶段

    导读 本文节选自机械工业出版社 程序员成长路线图 一书 该书的作者N216 张磊和吉阳一起回忆和总结了自己几十年的程序员成长经历 对当前程序员关心的热点 重点 难点问题给出了自己的看法和建议 通过对程序员的成长阶段进行划分 使得各个阶段的程
  • 什么是Java的跨平台性?原理是什么?

    所谓跨平台性 是指java语言编写的程序 一次编译后 可以在多个系统平台上 运行 实现原理 Java程序是通过java虚拟机在系统平台上运行的 只要该系统可以安 装相应的java虚拟机 该系统就可以运行java程序 机器码再上CPU运行 什
  • 《工程伦理与学术道德》之《工程活动中的环境伦理》

    工程伦理与学术道德 之 工程活动中的环境伦理 工程活动中的环境伦理 4 1 工程活动中环境伦理观念的确立 4 1 1 工业化过程中保护环境的两种思路 4 1 2 工程环境伦理的基本思想 4 1 3 工程环境伦理的核心问题 4 2 工程活动中
  • 22. 面向对象 - 高阶

    Hi 大家好 我是茶桁 之前的课程里面 我们简单的接触了面向对象编程 也和大家讲解了其思想 优缺点 相信上节课程结束之后 大家对面向对象都有了一定的理解 那么我们这节课 就进入面向对象的一些高阶部分 让我们继续来学习一些魔术方法以及Pyth
  • redis mysql_redis和mysql的结合示例

    mysql和redis的区别 mysql是关系型数据库 主要用于存放持久化数据 将数据存储在硬盘中 读取速度较慢 redis是非关系型数据库 即将数据存储在缓存中 缓存的读取速度快 能够大大的提高运行效率 但是保存时间有限 django中使
  • 【python】if __name__==‘__mian__‘ 如何理解,原理及作用

    1 什么是 name 1 为什么使用 name 属性 Python解释器在导入模块时 会将模块中没有缩进的代码全部执行一遍 模块就是一个独立的Python文件 开发人员通常会在模块下方增加一些测试代码 为了避免这些测试代码在模块被导入后执行