美文网首页Python小推车程序员
戏说python的特殊变量 __name__

戏说python的特殊变量 __name__

作者: 白菜代码小推车 | 来源:发表于2019-03-24 23:59 被阅读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

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

总结

  • 如果直接执行某个.py文件的时候,这个文件里面的__name__就是__main__,如果不是直接执行,而是被另外一个.py文件import的时候,这个文件里面的__name__是这个py的文件名。
  • 使用这个__name__可以对程序进行调试,如果说当程序之间互相之间调用,比较复杂的关系的时候,使用if __name__ == '__main__':将执行的代码放在里面,在执行其他的程序的时候,测试的程序本身不会运行,而这个程序有问题的时候,可以执行这个文件,那么if __name__ == '__main__':里面的代码就执行了。
  • 或者可以在不同的场景中来做不同的配置,作为包的时候是一套配置,作为主运行程序的时候又是另外一套配置,以应对不同的情况。

参考

如需转载,望能注明来源

相关文章

  • 戏说python的特殊变量 __name__

    python特殊变量__name__ 最近看一些代码的时候经常看到__name__,说实话,我不想看到它,有点丑,...

  • if __name__ == '__main__'

    每个 python 模块(python 文件,如下的 test.py)都包含了内置的变量 __name__, 用来...

  • Python初学笔记之装饰器(decorator)

    1、在Python中,函数是可以赋值给变量的,而且通过变量也可以调用该函数。如: 每个函数都有__name__ 这...

  • Python3学习 - 第五节

    Python脚本程序的“__name__”变量及其作用? 有句话经典的概括了这段代码的意义:“Make a scr...

  • python基础【__name__变量】

    Python使用缩进对齐组织代码的执行,所有没有缩进的代码,都会在载入时自动执行。 每个文件(模块)都可以任意写一...

  • Python 学习笔记 - 第四天

    模块是包括 Python 定义和声明的文件. 后缀.py. 模块名可以由全局变量__name__获取. fibo....

  • 关于“__name__”变量

    “__name__”是一个python内建的系统变量。这一点可以通过dir(__builtins__)来查看(参见...

  • __name__ =='__main__'的理解

    __ name__为python中的内置变量,用于指代当前模块。 test.py内容为 输出 在其他模块通过imp...

  • Python官方教程阅读总结-模块

    模块(module):包含python语句的文件 模块的文件名:模块名.py 变量__name__的值记录了一个模...

  • 问题笔记01

    If __name__ == ‘__main__’: 理解:__name__ 内置变量,可用于反映一个包的结构,可...

网友评论

    本文标题:戏说python的特殊变量 __name__

    本文链接:https://www.haomeiwen.com/subject/bgkmvqtx.html