Python 常用特殊变量与关键字详解
在 Python 的日常编程中,除了我们常见的关键字(如 if、for、class 等),还有一些特殊变量 和"伪关键字"------它们通常以双下划线开头和结尾(俗称 dunder ,即 double underscore 的缩写),用于在程序运行的不同阶段提供上下文信息。这些变量并不是保留字,但在 Python 中具有特殊意义。
本文将重点介绍几个常用的特殊变量,如 __file__、__name__、__doc__、__dict__ 等,并配合实例说明它们的用途。
1. __file__ ------ 当前文件的路径
含义
__file__ 是 Python 在加载模块时自动定义的一个变量,表示当前 Python 文件的路径。
用途
它经常用于:
- 获取当前脚本的绝对路径
- 构造相对路径读取文件
- 调试查看模块位置
示例
python
# file_demo.py
print(__file__)
运行:
bash
python file_demo.py
输出类似:
file_demo.py
(运行环境不同,可能会显示绝对路径,如 /home/user/project/file_demo.py)
如果需要绝对路径,可以结合 os.path:
python
import os
print(os.path.abspath(__file__)) # 获取绝对路径
print(os.path.dirname(__file__)) # 获取所在目录
2. __name__ ------ 模块的名字
含义
- 当一个 Python 文件直接运行时,
__name__的值是"__main__"。 - 当文件被作为模块导入时,
__name__的值是该模块的名字(不含路径和后缀)。
用途
常用于"脚本直接运行"和"被导入"之间做区分。
示例
python
# name_demo.py
print("当前模块名:", __name__)
if __name__ == "__main__":
print("这是直接运行的脚本")
else:
print("这是被导入的模块")
运行:
python name_demo.py
# 输出:
当前模块名: __main__
这是直接运行的脚本
如果在另一个文件导入:
python
import name_demo
# 输出:
当前模块名: name_demo
这是被导入的模块
3. __doc__ ------ 文档字符串
含义
__doc__ 保存模块、类、函数等对象的文档字符串(docstring),通常用于说明代码用途。
用途
便于文档生成工具读取,程序也可以通过它动态查看帮助信息。
示例
python
"""
这是模块的文档说明
"""
def greet():
"""打印欢迎信息"""
print("Hello World")
print(__doc__) # 输出模块文档
print(greet.__doc__) # 输出函数文档
4. __dict__ ------ 属性字典
含义
__dict__ 是对象(包括模块、类、实例)用来存储属性的内部字典。
用途
在动态设置或查看对象属性时很有用。
示例
python
class Person:
def __init__(self, name):
self.name = name
p = Person("Alice")
print(p.__dict__) # {'name': 'Alice'}
# 动态添加属性
p.age = 20
print(p.__dict__) # {'name': 'Alice', 'age': 20}
5. 其他常用双下划线变量
| 变量 | 说明 |
|---|---|
__annotations__ |
保存函数或变量的类型注解信息 |
__module__ |
类或函数所在的模块名 |
__class__ |
实例所属的类对象 |
__slots__ |
限制类实例可以拥有的属性,节省内存 |
__init__ |
构造方法,实例化时自动调用 |
__repr__ |
对象的官方字符串表示,用于调试 |
__str__ |
对象的可读字符串表示,供 print 使用 |
6. 注意事项
-
这些变量并不是保留字
你仍然可以定义同名变量,但会覆盖默认含义,这通常不推荐。
-
跨平台路径差异
在使用
__file__时,注意 Windows 与 Linux 的路径分隔符不同,最好用os.path处理。 -
交互模式下的行为差异
在 REPL(交互式解释器)中,有些变量(如
__file__)可能不存在。 -
私有化命名习惯
双下划线前后命名是 Python 内部约定,建议不要随意自定义这样的变量,以免与系统内部冲突。
总结
Python 的特殊变量(如 __file__、__name__、__doc__、__dict__ 等)为我们提供了模块、对象以及运行环境的元信息。理解并灵活应用这些变量,可以让代码更具有可维护性和可移植性,也有助于编写可复用的模块和库。