Python – 如何在类中定义公有、私有和保护变量

引言

Python作为一种面向对象的编程语言,提供了多种在类中封装数据的方法。
这种封装的一个关键方面是类变量的可见性,可以分为公共、受保护和私有。在本文中,我们将探讨如何在Python类中定义公共、私有和受保护的变量。

这些变量的行为与其他编程语言有很大不同。这些访问控制在Python中只是命名约定,而不是实际隐藏对象。

1. 公共变量

公共变量是最易访问的变量类型。它们可以在类内外的任何地方访问。在Python中,除非明确另行定义,否则所有类变量默认都是公共的。

示例:

class MyClass:
    def __init__(self, name):

self.name = name  # 公共变量

obj = MyClass("John")
print(obj.name)  # 可以在类外访问
# 输出 : John
在这个例子中,name 是一个公共变量。您可以在类外部访问和修改它,没有任何限制。

2. 受保护变量

受保护变量仅应在类及其子类中访问。虽然Python并不强制执行严格的访问控制,但指示变量为受保护的约定是用单个下划线(_)作为前缀。

示例:

class MyClass:
    def __init__(self, name, age):
        self._age = age  # 受保护变量

class ChildClass(MyClass):
    def display(self):

print(f"年龄: {self._age}")  # 在子类中可访问

obj = ChildClass("约翰", 30)
obj.display()  
# 输出: 年龄: 30

在这个例子中,age 是一个受保护的变量。虽然 Python 并不阻止你在类外直接访问它,但这样做违背了预期的用法。3. 私有变量

私有变量仅应在定义它们的类内部访问。Python 通过在变量名前加上双下划线 (__) 来表示私有变量。这会触发名称改编,使得从类外访问私有变量变得更加困难(但并非不可能)。

示例:

class MyClass:
    def __init__(self, name, age, salary):
        self.__salary = salary  # 私有变量

    def display_salary(self):

print(f"薪资: {self.__salary}")  # 在类内部可访问

obj = MyClass("约翰", 30, 50000)
obj.display_salary()  # 输出: 薪资: 50000

# 尝试在类外部访问私有变量
print(obj.__salary)  # 引发 AttributeError

 

在这个例子中,salary 是一个私有变量。如果你尝试从类外直接访问它,Python 将会引发一个 AttributeError。然而,你仍然可以使用名称改编版本来访问它,尽管这并不推荐。

名称改编示例:

print(obj._MyClass__salary)  # 输出: 50000

这行代码演示了私有变量是如何在内部被重命名为包含类名,从而使其不那么容易访问。

摘要

    • 公共变量:可以从任何地方访问;没有下划线。

 

    • 受保护变量:在类及其子类中可访问;前缀为单个下划线(_)。

 

    • 私有变量:仅在类内部可访问;前缀为双下划线(__)。

虽然Python的访问控制是基于命名约定而非严格执行,但遵循这些约定有助于保持代码的清晰性和完整性。理解如何定义和使用公共、受保护和私有变量对于有效的Python面向对象编程至关重要。

更多