在 Python 中,以两个下划线开头 (如 __method)的方法或属性,并不完全是"私有方法"(private method)------因为 Python 并没有像 Java 或 C++ 那样严格的访问控制机制。但这种命名方式会触发一种叫做 名称改写(name mangling)的机制,从而在一定程度上实现"私有性"。
1. 名称改写(Name Mangling)
当你在一个类中定义一个以双下划线开头、且不以双下划线结尾的方法或属性时,Python 解释器会自动将其名称改写为:
_ClassName__original_name
例如:
python
class MyClass:
def __init__(self):
self.__private_var = 42
def __private_method(self):
return "This is private"
obj = MyClass()
# obj.__private_method() # AttributeError!
print(obj._MyClass__private_method()) # 可以访问,但不推荐
虽然你仍然可以通过 _ClassName__name 的方式访问到这个"私有"成员,但这是一种约定+语言机制,目的是防止子类意外覆盖父类的内部方法,也提示开发者"这是内部使用的,不要直接调用"。
2. 与单下划线的区别
- 单下划线开头 (如
_method):只是约定表示"内部使用",不会触发名称改写,外部仍可访问。 - 双下划线开头 (如
__method):触发名称改写,提供更强的封装暗示。
3. 特殊方法(魔术方法)例外
注意:如果方法名前后都有两个下划线 (如 __init__, __str__),这是 Python 的特殊方法 (也叫魔术方法),不会被名称改写,也不表示私有,而是用于实现特定语言特性。
总结
- Python 没有真正的"私有方法"。
__method会被名称改写,起到模拟私有的作用。- 仍可通过
_ClassName__method访问,但应避免这样做。 - 这是一种约定 + 语言机制,用于封装和避免命名冲突。