Python入门教程第65篇 __name__变量

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门教程第65篇 __name__变量相关的知识,希望对你有一定的参考价值。

本篇我们将会学习 Python 中的一个特殊变量 __name__,以及如何在模块中合理使用该变量。

__name__ 变量简介

如果我们查看 Python 源代码,很有可能会看到以下形式的 __name__ 变量:

if __name__ == '__main__':
    main()

那么 __name__ 变量到底是什么呢?

由于 __name__ 两端都有一个双下划线,因此被称为 dunder 变量名,dunder 代表了 double underscores。

__name__ 是 Python中的一个特殊变量,因为 Python 会基于脚本的执行方法为该变量指定不同的值。

当我们导入一个模块时, Python 会执行与该模块关联的文件。我们通常想要编写一个既能够被直接执行,又能够被当作模块导入的脚本。__name__ 变量可以实现这个功能。

当我们直接运行脚本时,Python 会将 __name__ 变量设置为“__main__”。但是,当我们将文件作为模块导入时,Python 会将 __name__ 变量设置为模块名。

__name__ 变量示例

首先,我们创建一个新的模块 billing,该模块包含两个函数:calculate_tax() 以及 print_billing_doc()。另外,我们在增加一个打印 __name__ 变量的语句:

def calculate_tax(price, tax):
    return price * tax


def print_billing_doc():
    tax_rate = 0.1
    products = ['name': 'Book',  'price': 30,
                'name': 'Pen', 'price': 5]

    # print billing header
    print(f'Name\\tPrice\\tTax')

    # print the billing item
    for product in products:
        tax = calculate_tax(product['price'], tax_rate)
        print(f"product['name']\\tproduct['price']\\ttax")


print(__name__)

然后,我们创建一个新的文件 app.py,内容就是导入 billing 模块:

import billing

当我们执行 app.py 文件时:

> python app.py

打印的 __name__ 变量内容如下:

billing

这意味着 Python 在导入 billing 模块时执行了 billing.py 文件。app.py 文件中的 __name__ 变量被设置为模块名 billing。

如果我们直接执行 billing.py:

> python billing.py

输出结果如下:

__main__

此时 __name__ 变量的值为“__main__ ”。

因此,__name__ 变量 allows you可以用于检查文件是被直接执行还是导入为模块。例如,为了在 billing.py 被直接执行时调用 print_billing_doc() 函数,我们可以在 billing.py 文件中增加以下语句:

if __name__ == '__main__':
    print_billing_doc()

然后,我们直接执行 billing.py 文件,将会看到以下输出:

Name    Price   Tax
Book    30      3.0
Pen     5       0.5

此时,如果我们执行 app.py 文件,不会看到上面的输出,因为 __name__ 变量的值为“billing”,不会执行 if 语句。

总结

  • 当我们直接运行脚本文件时,Python 会将 __name__ 变量的值设置为“__main__”。当我们将文件作为模块导入时,Python 会将 __name__ 变量的值设置为模块名。

以上是关于Python入门教程第65篇 __name__变量的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象编程第12篇 特殊方法之__eq__

Python面向对象编程第12篇 特殊方法之__eq__

Python_实用入门篇_10

Python进阶---面向对象第三弹(进阶篇)

接口测试基础——第7篇 简单的Python知识普及

Python面向对象编程第14篇 特殊方法之__bool__