__name__ 是 Python 中的一个内置属性,用于标识模块或脚本的名称。它是每个模块或脚本都拥有的一个特殊属性。
__name__ 的值
- 当模块被 直接运行 时,__name__ 的值为 '__main__'。
- 当模块被 导入 到另一个模块时,__name__ 的值为模块的 名称(不包括 .py 扩展名)。
用法
__name__ 属性通常用于在模块被直接运行时执行特定的代码块。这可以通过以下方式实现:
def main():
# 要执行的代码
if __name__ == '__main__':
main()
在上面的代码中,如果 mymodule.py 被直接运行,则 main() 函数会被调用。这是因为 __name__ 的值为 '__main__'。但是,如果 mymodule.py 被导入到另一个模块中,则 main() 函数不会被调用。这是因为 __name__ 的值为模块的名称('mymodule'),而不是 '__main__'。
常见用法
以下是一些 __name__ 属性的常见用法:
- 执行模块级代码: 使用 if __name__ == '__main__': 语句块来执行仅在模块被直接运行时才应执行的代码。这通常用于包含模块级初始化代码或测试代码。
- 测试模块: 在 if __name__ == '__main__': 语句块中编写测试代码,以测试模块的功能。这有助于确保模块按预期工作。
- 创建可重用的代码: 编写可以在其他模块中导入和使用的代码,并在 if __name__ == '__main__': 语句块中包含模块特定的代码。这可以帮助您组织代码并提高代码的可重用性。
示例
以下是一个更详细的示例,演示如何使用 __name__ 属性:
def greet(name):
print(f'Hello, {name}!')
if __name__ == '__main__':
# 模块级代码
names = ['Alice', 'Bob', 'Charlie']
for name in names:
greet(name)
# 测试代码
greet('John')
greet('Jane')
在这个示例中:
- 模块级代码仅在模块被直接运行时执行。它遍历一个名称列表并调用 greet() 函数为每个名称打印问候语。
- 测试代码也在 if __name__ == '__main__': 语句块中,但它位于模块级代码之后。它调用 greet() 函数两次,以测试其功能。
当该模块被直接运行时,它将打印以下输出:
Hello, Alice!
Hello, Bob!
Hello, Charlie!
Hello, John!
Hello, Jane!
但是,如果该模块被导入到另一个模块中,则只有模块级代码会被执行。测试代码将不会被执行,因为 __name__ 的值不是 '__main__'。