Python小推车程序员

戏说python的特殊变量 __name__

2019-03-24  本文已影响20人  白菜代码小推车

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.pymarry()删除,在test.py里面执行marry()这个方法,然把之前的test.py里面的内容换成下面这个,(记得把test.pycuihua_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

好的,狗子与翠花的故事完结了,很圆满。

总结

参考

如需转载,望能注明来源

上一篇 下一篇

猜你喜欢

热点阅读