python特殊变量__name__
最近看一些代码的时候经常看到__name__
,说实话,我不想看到它,有点丑,这就像在现实生活中有名字人叫一二三狗子三二一
之类的。说到丑啊,我实在是不得不想起之前的一个让人哭笑不得的事情
“身份证为什么拍得这么丑?”
因为拍的太漂亮太好看,你就会到处炫耀,谁知道哪一天给别人欣赏你的“秀色可餐”的面容的时候忘记拿回来,弄丢了。想想觉得很有道理!真的感谢公安人员的良苦用心啊!!!
这个变量就是python的内置变量
,写成这样就是防止你编程的时候取变量名的用到这个名字,你会用一二三狗子三二一
给自己的娃取名?(变量命名要么是_
开头,要么是英文字母
开头)。那它表示什么意思呢?
它的意思就是运行的程序的名字(name)。
首先写一个简单的python
程序看一看,把这句话存到test.py
中运行一下:
print("NAME IS : " + __name__)
运行python test.py
,结果是:
NAME IS : __main__
咋地又来了一个一二三翠花三二一
(__main__
)?哈哈,你没有看错,这个内置变量的真实名字(值)是__main__
。
好吧!感觉python
这个世界有着形形色色的东西啊!
那它有着啥子用呢?
在一些代码中你可能经常看到这个写法:
if __name__ == '__main__':
balabala...
代码翻译过来就是,如果这个程序的名字
是__main__
,那么就balabala...
,那刚才我们试了,程序的名字就是__main__
这个翠花大西瓜啊!为啥还做这个判断呢?难道是下雨天打孩子——闲着也是闲着?
嘿!如果把__name__
放在函数里面是不是会神秘一些呢?我们把下面这些代码保存到cuihua_and_dog.py
里面
# cuihua_and_dog.py
# 声明一个函数,这个用来试验(名字我都给取好了,叫翠花狗子)
def marry():
baby = "cuihua" + "dog"
print(__name__ + "'s baby is : " + baby)
marry()
当直接运行python cuihua_and_dog.py
的,结果是:
__main__'s baby is : cuihuadog
结果__name__
还是和之前的那样,还是__main__
这样太直接的运行cuihua_and_dog.py
实在是没意思,我们来回到狗子翠花小的时候!我们不这么直接的运行它,我们把它当做模块或者说包来运行看看会怎样!把cuihua_and_dog.py
的marry()
删除,在test.py
里面执行marry()这个方法
,然把之前的test.py
里面的内容换成下面这个,(记得把test.py
和cuihua_and_dog.py
这两个文件放在一个文件夹里面)
# test.py
# 从cuihua_and_dog包里面导入marry方法到这里来
from cuihua_and_dog import marry
marry()
然后运行python test.py
,结果是:
cuihua_and_dog's baby is : cuihuadog
__name__
名字终于变了,看来老天也觉得这个名字好!就这个了翠花狗子
,哈哈!
按照上面看,cuihua_and_dog.py
在两种不同的运行方式里,__name__
不一样:
cuihua_and_dog.py --> __mian__
+----------+ /
| | / 直接运行
| __name__ | -------
| | \ 当做包运行
+----------+ \
--> cuihua_and_dog
就是说,当这个程序直接运行的时候,__name__
的值就是__main__
,如果作为包运行的时候就是包名。到这里应该理解了为什么__name__
的值会是 __main__
了吧,也是为了防止我们把包的名字取为这个。
回到刚才那个if __name__ == '__main__':
这句话上面来,想一下,如果说是直接执行这个程序的话,那么这个判断就成立了,那就执行if
里面的代码;如果是被当做包运行,那就不会运行if
里面的代码。
一般在执行程序的时候,直接执行的那个是父亲,被加载的包是子女。
但是翠花和狗子小时候(当做包运行)怎么可能会结婚呢?这样做不行,既然可以用if
来判断,我们改一下cuihua_and_dog.py
里面的代码:
# cuihua_and_dog.py
def marry():
if __name__ == "__main__": # 翠花狗子长大了(直接执行)
baby = "cuihua" + "dog"
print("baby is : " + baby)
else: # 翠花狗子还是小时候(被当做包导入执行)
print("They are the kids! It is a guojiajia game!")
# 翠花狗子长大了(直接执行)
if __name__ == "__main__":
marry()
这样我们在回头来执行一下python test.py
,结果是:
They are the kids! It is a guojiajia game!
但是当翠花和狗子长大了(我们直接执行)的时候python cuihua_and_dog.py
,结果是
baby is : cuihuadog
好的,狗子与翠花的故事完结了,很圆满。
总结
- 如果直接执行某个
.py
文件的时候,这个文件里面的__name__
就是__main__
,如果不是直接执行,而是被另外一个.py
文件import
的时候,这个文件里面的__name__
是这个py
的文件名。 - 使用这个
__name__
可以对程序进行调试,如果说当程序之间互相之间调用,比较复杂的关系的时候,使用if __name__ == '__main__':
将执行的代码放在里面,在执行其他的程序的时候,测试的程序本身不会运行,而这个程序有问题的时候,可以执行这个文件,那么if __name__ == '__main__':
里面的代码就执行了。 - 或者可以在不同的场景中来做不同的配置,作为包的时候是一套配置,作为主运行程序的时候又是另外一套配置,以应对不同的情况。
参考
如需转载,望能注明来源
网友评论