if __name__ == "__main__":
工欲善其事,必先利其器
# 环境:Python3.6 + win10
# 目录结构:
D:\test\ # 目录
├─ t1.py # 文件
└─ t2.py # 文件
让模块如脚本一样运行
在Python中,可以说,每一个py文件都可以说是一个模块,那么每一个模块不仅仅能被调用,也要负责本身的逻辑,如我们在模块t1中定义了一个登录函数并实现登录逻辑:
# t1.py
def login(user, pwd):
if user == '张开' and pwd == '':
return 'login successful'
return 'login error' user, pwd = input('user: ').strip(), input('pwd: ').strip()
print(login(user, pwd))
t1.py
那么,这个模块在自己使用的时候,肯定没有问题。但是有一天,这个牛逼的模块被别人使用了,在t2中调用了t1的注册功能:
# t1.py
def register():
user, pwd = input('user: ').strip(), input('pwd: ').strip()
if user == '张开' and pwd == '':
return 1
return 0 def login(user, pwd):
if user == '张开' and pwd == '':
return 'login successful'
return 'login error' user, pwd = input('user: ').strip(), input('pwd: ').strip()
print(login(user, pwd))
被t2.py 调用了的t1.py
# t2.py
import t1
def register():
if t1.register():
return 'register successful'
return 'register error'
print(register()) '''
user: a
pwd: a
login error
user: a
pwd: a
register error
'''
t2.py
那么,在t2模块内部要实现注册的时候,想到t1不是实现了一个注册的功能了吗?我们就要避免重复造轮子,就直接调过来用了,但是问题来了,当我们在调用一个模块的时候,该模块内的代码会先执行一遍,也就是t2模块示例代码最后展示的交互结果。当t2模块内的代码执行到import t1的时候,触发了原本t1模块的执行,t1模块内部代码从上往下执行,就执行到了登录逻辑。等登录逻辑执行完毕,程序回到t2模块继续往下执行。也就执行到了t2内部的注册函数的执行。而t2的注册函数此时又调用了t1模块的注册的函数的执行,等注册逻辑执行完毕,程序往下继续执行——没有代码,程序结束。
由上述示例可以见到,我们在t2模块调用t1模块的时候,只想调用注册函数,并不想触发t1登录逻辑的执行,那么,该怎么办呢?
if __name__ == "__main__":
我们首先看一下模块内自带都有哪些属性:
# t1.py
print(dir())
'''
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
'''
在上述的打印列表内,此时,__name__属性在这里对我们有帮助,那么我们来研究一个__name__属性是什么鬼?
我们先在各自模块内部打印一下__name__属性。
# t1.py
print('module t1.__name__:', __name__, type(__name__))
'''
module t1.__name__: __main__ <class 'str'>
'''
# t2.py
# import t1
print('module t2.__name__: ', __name__, type(__name__))
'''
module t2.__name__: __main__ <class 'str'>
'''
通过上例可以看到,各模块各自运行的结果一致,__name__属性都返回了一个str类型的__main__结果,你可能说,这没啥啊,扯半天淡就这看这个了?别急,我们放开t2模块的import t1注释再看:
# t1.py
print('module t1.__name__:', __name__, type(__name__))
'''
module t1.__name__: __main__ <class 'str'>
'''
# t2.py
import t1
print('module t2.__name__: ', __name__, type(__name__))
'''
module t1.__name__: t1 <class 'str'>
module t2.__name__: __main__ <class 'str'>
'''
通过执行t2模块,发现一个有趣的现象,在导入t1的时候,触发了t1模块的执行,但是,看看此时t1的打印是什么,没错,是t1的模块名!而单独运行t1的时候,结果仍不变,还是__main__。
那么,由此可以做些手脚了,我们通过__name__返回不同的字符串(自己调用返回__main__,被调用时返回自己的模块名),来解决上面那个登录逻辑被执行的问题。那么,我们就在t1中加上一句话:
# t1.py
def register():
user, pwd = input('user: ').strip(), input('pwd: ').strip()
if user == '张开' and pwd == '':
return 1
return 0 def login(user, pwd):
if user == '张开' and pwd == '':
return 'login successful'
return 'login error' if __name__ == '__main__':
user, pwd = input('user: ').strip(), input('pwd: ').strip()
print(login(user, pwd))
t1.py
# t2.py
import t1
def register():
if t1.register():
return 'register successful'
return 'register error'
print(register())
'''
user: 张开
pwd: 666
register successful
'''
t2.py
在t1模块中,当__name__属性返回是字符串__main__的时候,这说明是此次执行是t1模块自己被自己调用,那么我们就把想要实现的逻辑放到该if语句内,表明自己调用时执行。
而当别的模块如t2调用t1的时候,__name__属性返回了t1的模块名,那么t1不等于__main__,t1模块内部的if语句也就不会执行。这样就解决了上例中登录的问题。
that's all
if __name__ == "__main__":的更多相关文章
- python中if __name__ == "__main__":用法解析
__name__: __name__作为模块的内置属性,简单点说呢,就是.py文件的调用方式. __main__: 如果__name__等于"__main__"就表示是直接执行. ...
- Python if __name__ == '__main__':
python属于脚本语言,只能逐行运行, if __name__ == '__main__':这句相当于main(),即首先执行这条语句.
- 浅析 if __name__ == __main__ :
有句话经典的概括了这段代码的意义: “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可 ...
- python中if __name__ == '__main__' :main(()
例如: if __name__ == '__main__': main() 如果运行的是主函数的话,执行下一句main() 如果作为模块被其他文件导入使用的话,我们就不执行后面的main()什么的. ...
- Python中if __name__ == '__main__':的作用和原理
if __name__ == '__main__':的作用 一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行. ...
- 使用unittest,if __name__ == '__main__':里代码不执行的解决办法
参考:https://www.cnblogs.com/hanmk/p/8656574.html
- if __name__ == "__main__": 怎么理解?
参考:https://www.cnblogs.com/Neeo/p/9504779.html 总结: 1.防止模块间调用时,执行被调用模块实例化执行,换句话说,就是不要执行调用模块原来实例化的内容 2 ...
- Python3:if __name__ == '__main__' 详解
一般在风格比较好的代码中会有一行if __name__ == '__main__' :代码,这里说明一下这句代码的用处,先上两个代码test1.py和test2.py: # test1.py prin ...
- 转载:Python中的if __name__ == '__main__'
刚开始学习Python时,对于有些书出现的函数带有“if __name__ == '__main__'”总是迷惑不解,比如<dive into Python>中开头的哪个根据输入的数字计算 ...
随机推荐
- vue2.0 在微信端如何使用本地IP访问项目
我们会遇到这样的需求,在PC端开发vue脚手架项目,希望在微信端随时浏览页面(如果打包再发布到服务器又太麻烦),怎么办? 思路很简单:保证手机和电脑在同一个IP下,用同一个IP访问项目,这样就可以了: ...
- 完美:利用旧版iCloud更改Apple ID地区
朋友们,你们有没有尝试过从大陆地区以外的App Store上下载APP呢?或许听起来蛮有趣的,其实并不难,只需要更改Apple ID的地区就可以了,许多用户就是卡在下一步,需要输入付款信息,不过下面苹 ...
- ASP.NET Core MVC+EF Core从开发到部署
笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...
- Spring Security的核心拦截器
1. HttpSessionContextIntegrationFilter 位于过滤器顶端,第一个起作用的过滤器. 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个Sec ...
- 为 git设置代理
普通设置 git config --global http.proxy 'socks5://127.0.0.1:1080'git config --global https.proxy 'socks5 ...
- 12.vue属性.监听.组件
1.计算属性 https://cn.vuejs.org/v2/guide/computed.html new Vue({ computed:{//定义 show(){ } } }) ++计算属性1.h ...
- CSS div 高度满屏
方法一: 通过JQuery,获取窗体的高度,设置给对应的div.代码如下 ht = $(document.body).height(); $(); 缺点:由于浏览器是先解析css,后执行JS,导致页面 ...
- 剑指offer——python【第28题】数组 中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- python全栈开发 * 18 面向对象知识点汇总 * 180530
18 面向对象初识1class person: level="高级动物" mind="有思想" def __init__(self,name,age,gent, ...
- JAVA期末考试整理
Technical problem: 0.read: Scanner input= new Scanner(System.in) random#: x=(int)(Math.random()*10) ...