在Python编程语言中,两个下划线前缀(如__)具有特殊的意义,这种用法在Python中被称为名称修饰(name mangling),下面将详细解释两个下划线在Python中的用法,以及它们背后的原理和实际操作。
在Python中,名称修饰是一种自动重写属性名称的机制,主要用于类内部,当你在类中使用两个下划线作为变量名前缀时,Python解释器会对这些名称进行特殊处理,以下是详细的解答:
单下划线和双下划线的区别
我们需要了解单下划线和双下划线的区别,在Python中,单下划线(_)用作变量的命名约定,表示这个变量是“受保护的”,不建议外部直接访问,而双下划线则用于名称修饰。
名称修饰的作用
名称修饰的主要作用是避免子类意外重写基类的方法或属性,以下是一个详细操作:
1. 类内部的双下划线
当你定义一个类,并在其内部使用双下划线前缀的变量时,Python解释器会将这些变量名进行名称修饰。
class MyClass:
def __init__(self):
self.__private_var = 10
def __private_method(self):
return self.__private_var在这个例子中,__private_var 和__private_method 都是私有变量和方法,外部无法直接访问。
2. 名称修饰的原理
当你定义一个带有双下划线的变量或方法时,Python解释器会自动重写其名称,具体做法是在前面加上单下划线和类名,以上面的例子为例:
m = MyClass() print(m.__private_var) # 这会引发错误
__private_var 被重写为_MyClass__private_var,正确的访问方式是:
print(m._MyClass__private_var) # 输出:10
虽然可以这样访问,但强烈不建议这样做,因为这违反了名称修饰的初衷。
实际操作和使用场景
以下是如何正确使用双下划线的实际操作:
1. 封装内部实现
当你希望封装一个类的内部实现,不让外部直接访问某些属性或方法时,可以使用双下划线。
class BankAccount:
def __init__(self, account_number, balance):
self.__account_number = account_number
self.__balance = balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
return True
return False
def get_balance(self):
return self.__balance在这个例子中,__account_number 和__balance 都是私有属性,外部无法直接访问,只能通过提供的方法(如deposit、withdraw、get_balance)进行操作。
2. 防止子类重写
双下划线还可以防止子类意外重写基类的属性或方法。
class Derived(BankAccount):
def __init__(self, account_number, balance, extra_info):
super().__init__(account_number, balance)
self.__extra_info = extra_info
def get_info(self):
return self.__extra_info在这个例子中,Derived 类继承了BankAccount 类,并添加了一个新的属性__extra_info,由于使用了双下划线,即使子类中也有名为__extra_info 的属性,它们也不会相互影响。
在Python中使用两个下划线作为变量名前缀,是一种实现封装和名称修饰的机制,它有助于保护类的内部实现,避免外部直接访问,同时防止子类意外重写基类的属性或方法,掌握这一机制,可以使你的代码更加健壮,易于维护,在使用时,需要注意遵循命名约定,不要滥用双下划线,以免造成混淆。

