📅  最后修改于: 2023-12-03 15:24:34.741000             🧑  作者: Mango
在Python中,可以使用“_”或“__”作为前缀来声明私有属性。但是,请注意,这只是一种惯例,Python并没有实现真正的私有属性。
在使用“_”或“__”作为前缀声明属性时,Python会使用名称修饰符来重命名属性,从而使其在外部变得不可访问。但是,这并不能真正地防止外部代码访问私有属性。以下是如何在Python中声明私有属性的几种方法。
这是最常用的方式。使用单下划线作为前缀表示属性是受保护的,但是它仍然可以从类的外部访问。例如,假设我们有一个名为“Person”的类,其中有一个名为“_name”的属性:
class Person:
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
p = Person("John")
print(p.get_name()) # 输出 John
print(p._name) # 也可以输出 John,但是不推荐这样做
在上面的代码中,“_name”属性被声明为受保护的,但是我们仍然可以从类的外部访问它。因此,我们通常使用getter和setter方法来访问私有属性,而不是直接访问它们。
这种方法在Python中被称为名称修饰符(name mangling),它可以更好地保护属性。使用双下划线作为前缀表示属性是私有的,不能从类的外部访问。例如,假设我们有一个名为“BankAccount”的类,其中有一个名为“__balance”的属性:
class BankAccount:
def __init__(self, balance):
self.__balance = balance
def get_balance(self):
return self.__balance
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if self.__balance >= amount:
self.__balance -= amount
else:
print("Insufficient balance")
my_account = BankAccount(1000)
print(my_account.get_balance()) # 输出 1000
my_account.deposit(500)
print(my_account.get_balance()) # 输出 1500
my_account.withdraw(2000) # 输出 Insufficient balance
print(my_account.get_balance()) # 输出 1500
在上面的代码中,“__balance”属性被声明为私有的,因此我们不能从类的外部访问它。如果我们尝试这样做,Python会将属性名重新命名为“_className__attributeName”的格式。例如,在上面的代码中,我们可以使用“_BankAccount__balance”从类的外部访问“__balance”属性:
print(my_account._BankAccount__balance) # 输出 1500
但是,我们并不推荐这样做。通常,我们应该使用getter和setter方法来访问私有属性,而不是直接访问它们。
总结:
使用“”或“__”作为前缀可以声明Python中的私有属性。但请记住,这只是一种惯例,Python并没有实现真正的私有属性。使用“”作为前缀表示属性是受保护的,但仍然可以从类的外部访问。使用“__”作为前缀表示属性是私有的,不能从类的外部访问。但是,使用名称修饰符仍然可以从类的外部访问属性,因此我们通常使用getter和setter方法来访问私有属性,而不是直接访问它们。