文章目录
- 1. 单下划线前缀(_variable 或 _method())
- 2. 双下划线前缀(__variable 或 __method())
- 3. 前后双下划线(__variable__ 或 __method__)
- 4. 单下划线(_)单独使用
- 总结
在 Python 中,变量名和方法名前的单下划线(_)和双下划线(__)是一种命名约定,用于表示不同的访问级别和特殊用途。以下是详细介绍:
1. 单下划线前缀(_variable 或 _method())
含义:约定为“私有”,表示该变量或方法仅供内部使用,不建议外部直接访问。
作用:
- 提示其他开发者不要随意访问,但 Python 不会强制限制。
- 在模块导入时,使用
from module import *
会忽略以单下划线开头的对象(除非模块中定义了__all__
)。
示例:
class MyClass:
def __init__(self):
self._internal_var = 42 # 内部变量
def _internal_method(self): # 内部方法
return "This is internal"
obj = MyClass()
print(obj._internal_var) # 可以访问,但不推荐
2. 双下划线前缀(__variable 或 __method())
含义:名称修饰(Name Mangling),用于避免子类意外覆盖父类的属性或方法。
作用:
- Python 会自动将
__name
转换为_ClassName__name
,使其在类外部难以访问。 - 主要用于防止继承冲突,而非严格限制访问。
示例:
class Parent:
def __init__(self):
self.__private_var = 10 # 私有变量
def __private_method(self): # 私有方法
return "Private method"
class Child(Parent):
pass
p = Parent()
print(p._Parent__private_var) # 可以访问,但需通过修改后的名称
print(p.__private_var) # 报错:AttributeError
c = Child()
print(c._Parent__private_method()) # 父类的私有方法被保留
3. 前后双下划线(variable 或 method)
含义:特殊方法(Magic Methods)或内置属性,由 Python 解释器调用。
常见用途:
__init__()
:类的构造函数__str__()
:对象的字符串表示(str(obj)
)__len__()
:对象的长度(len(obj)
)__call__()
:使对象可调用(obj()
)
示例:
class MyNumber:
def __init__(self, value):
self.value = value
def __add__(self, other): # 重载加法运算符
return MyNumber(self.value + other.value)
def __str__(self): # 定义打印时的输出
return f"MyNumber({self.value})"
a = MyNumber(5)
b = MyNumber(10)
print(a + b) # 输出: MyNumber(15)
4. 单下划线(_)单独使用
含义:
- 临时变量:在循环或解包中表示不需要的变量。
- 国际化(i18n):在
gettext
等库中用于翻译函数。 - 交互式解释器:保存上一次执行的结果。
示例:
# 临时变量
for _ in range(3):
print("Hello")
# 解包时忽略某些值
name, _, age = ("Alice", "Female", 30)
# 交互式解释器中
>>> 2 + 3
5
>>> print(_)
5
总结
命名方式 | 含义与用途 |
---|---|
_variable | 约定为私有变量,不建议外部访问。 |
__variable | 名称修饰,防止子类覆盖,实际可通过 _ClassName__variable 访问。 |
__variable__ | 特殊方法或内置属性,由 Python 解释器自动调用。 |
_ | 临时变量、国际化或保存交互结果。 |
注意:
- Python 的访问控制是基于约定而非强制,开发者应自觉遵守命名规范。
- 避免自定义名称使用
__xx__
格式,以防与 Python 内置功能冲突。