📜  如何在python中声明私有属性(1)

📅  最后修改于: 2023-12-03 15:24:34.741000             🧑  作者: Mango

如何在Python中声明私有属性

在Python中,可以使用“_”或“__”作为前缀来声明私有属性。但是,请注意,这只是一种惯例,Python并没有实现真正的私有属性。

在使用“_”或“__”作为前缀声明属性时,Python会使用名称修饰符来重命名属性,从而使其在外部变得不可访问。但是,这并不能真正地防止外部代码访问私有属性。以下是如何在Python中声明私有属性的几种方法。

方法1:使用单下划线作为前缀

这是最常用的方式。使用单下划线作为前缀表示属性是受保护的,但是它仍然可以从类的外部访问。例如,假设我们有一个名为“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方法来访问私有属性,而不是直接访问它们。

方法2:使用双下划线作为前缀

这种方法在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方法来访问私有属性,而不是直接访问它们。