在 Python 中,以双下划线(__
)开头但不以双下划线结尾的变量主要用于类的私有属性,这种命名方式被称为名称修饰(name mangling)。名称修饰会将变量名转换为类名和变量名的组合,从而避免在子类中发生意外覆盖。
一.Python中的名称修饰
1.名称修饰的例子
以下是一个示例,展示了如何使用名称修饰来定义私有变量:
class MyClass:def __init__(self, value):self.__value = value # 名称修饰为 _MyClass__valuedef get_value(self):return self.__valueobj = MyClass(10)
print(obj.get_value()) # 输出:10
# 直接访问会报错,因为名称被修饰了
# print(obj.__value) # AttributeError: 'MyClass' object has no attribute '__value'# 可以通过 _类名__变量名 的方式访问
print(obj._MyClass__value) # 输出:10
2.为什么使用名称修饰
(1)避免名称冲突:在子类中定义相同名称的变量时,可以避免与父类的私有变量发生冲突。
(2)信息隐藏:虽然 Python 并没有严格的访问控制,但名称修饰提供了一种弱约定,以表明该变量不应该在类外部直接访问。
二.Python中的特殊属性
1.魔术方法
除了私有变量,Python 类还使用一些特殊属性,这些属性以双下划线开头和结尾,通常称为魔术方法(magic methods)或双下划线方法(dunder methods)。这些方法和属性在类的行为定义中起着重要作用。
常见的魔术方法包括:
__init__
: 对象初始化方法(构造函数)__str__
: 返回对象的字符串表示,适合用户阅读__repr__
: 返回对象的官方字符串表示,适合开发者阅读__len__
: 返回对象的长度__getitem__
: 允许对象使用索引操作
2.特殊属性示例
class Example:def __init__(self, name):self.__name = namedef __str__(self):return f"Example object with name: {self.__name}"def __repr__(self):return f"Example('{self.__name}')"def __len__(self):return len(self.__name)def __getitem__(self, index):return self.__name[index]example = Example("Python")
print(str(example)) # 输出:Example object with name: Python
print(repr(example)) # 输出:Example('Python')
print(len(example)) # 输出:6
print(example[0]) # 输出:P
总结来说,以双下划线开头的变量在 Python 中用于实现私有属性,通过名称修饰避免名称冲突。魔术方法则定义了对象的特殊行为,可以通过自定义这些方法来增强类的功能。