Python中的访问修饰符

2025年9月10日 | 阅读 7 分钟

访问修饰符被 C++、Java、Python 等遵循面向对象范例的各种编程语言使用。访问修饰符用于修改类成员变量和方法在类外部的访问权限。封装是 OOPs 的一个原则,它通过公共、受保护和私有等访问修饰符来保护类的内部数据。

在接下来的教程中,我们将学习访问修饰符及其类型。我们还将讨论如何在 Python 编程语言中使用它们。

访问修饰符的类型

Python 提供三种级别的访问修饰符

  1. 公共 (name): 公共访问修饰符的成员可以在任何地方访问。
  2. 受保护 (_name): 受保护访问修饰符的成员应仅在类及其子类内部访问。它不适用于公共用途。
  3. 私有 (__name): 私有访问修饰符的成员只能在类内部(使用名称修饰)访问。
Access Modifiers in Python

让我们通过示例来讨论这些修饰符。

1. 公共访问修饰符

公共访问修饰符的成员变量和方法在程序中的任何地方都可以访问。默认情况下,Python 类中的所有属性和方法都是公共的,除非被显式修改。

让我们看一个公共访问修饰符的示例如下

示例

输出

Lion
Den
Lion lives in Den

说明

在上面的代码片段中,我们定义了一个名为 Animal 的类。Animal 类有两个成员变量 name 和 home,以及一个 display_data() 方法,该方法打印成员变量的值。这两个变量都是公共的,因为没有分配特定的关键字(或约定)给它们。然后我们将该类实例化为 wild_animal。然后我们打印了公共属性的值并调用了该方法来打印创建对象的详细信息。

公共访问修饰符的关键特性

  1. 公共成员可以从任何地方访问公共访问修饰符。
  2. 属性和方法都可以从类外部修改。

2. 受保护的访问修饰符

受保护访问修饰符的成员变量和方法只能在声明它的类及其子类内部访问。为了实现受保护的字段或方法,开发人员遵循特定的命名约定,通常是通过在变量或函数名称前添加前缀。

受保护的成员由单个下划线 (_variable) 指示。请注意,Python 解释器不像其他语言那样强制执行此限制;它仅为程序员指定,因为他们会尝试使用普通名称访问它,而不是通过相应的名称前缀调用。

让我们看一个受保护访问修饰符的示例如下。

示例

输出

Lion
Den
Lion lives in Den

说明

在上面的代码片段中,我们定义了一个名为 Animal 的类。Animal 类有两个成员变量 _name 和 _home,以及一个受保护的方法 _display_data(),该方法打印成员变量的值。这两个变量都是受保护的,前面带有单个下划线 (_)。然后我们将该类实例化为 wild_animal。然后我们打印了受保护属性的值并调用了该方法来打印创建对象的详细信息。

注意:可以访问受保护的成员;但是,不建议这样做。

受保护访问修饰符的关键特性

  1. 单个下划线 (_) 只是一个约定。它不会阻止从外部访问。
  2. 变量仍然可以从类外部访问和修改。
  3. 受保护的成员通常在设计父子类关系(继承)时使用,在子类中可以访问它们。

3. 私有访问修饰符

私有访问修饰符的成员变量和方法只能在类内部访问。私有访问修饰符是最安全的访问修饰符。私有成员由变量或方法名称前的双下划线 (__) 指示。Python 会执行名称修饰,这意味着它会在内部更改变量的名称以防止意外访问。

让我们看一个私有访问修饰符的示例如下。

示例

说明

在上面的代码片段中,我们定义了一个名为 Animal 的类。Animal 类有两个成员变量 __name 和 __home,以及一个私有方法 __display_data(),该方法打印成员变量的值。这两个变量都是受保护的,前面带有双下划线 (__)。然后我们将该类实例化为 wild_animal。然后我们尝试打印私有属性的值并调用了该方法来打印创建对象的详细信息。但是,这样做会引发错误。

使用名称修饰访问私有成员

我们在 Python 中无法直接从类外部访问或修改私有属性。Python 执行的名称修饰使其困难,但并非不可能。强烈建议不要这样做,因为它会破坏封装。

在名称修饰中,我们可以将类的私有成员从 __name 重命名为 _ClassName__name。让我们看一个说明使用名称修饰来访问类私有成员的示例如下。

示例

输出

Lion
Den
Lion lives in Den

说明

在上面的代码片段中,我们定义了一个名为 Animal 的类。Animal 类有两个成员变量 __name 和 __home,以及一个私有方法 __display_data(),该方法打印成员变量的值。这两个变量都是受保护的,前面带有双下划线 (__)。然后我们将该类实例化为 wild_animal。

然后我们使用了名称修饰,我们将私有属性从 __name 和 __home 分别重命名为 _Animal__name 和 _Animal__home,并为用户打印了它们的值。然后我们再次使用名称修饰调用该方法来打印创建对象的详细信息。在这种情况下,值被成功打印。

私有访问修饰符的关键特性

  1. 私有访问修饰符的成员不能直接从类外部访问。
  2. 名称修饰允许用户访问私有成员;但是,除非必要,否则应避免这样做。
  3. 这确保了更好的封装,并防止变量被意外修改。

Python 中不同访问修饰符的比较

现在我们将通过表格比较 Python 中的公共、受保护和私有访问修饰符。

访问修饰符语法可访问性示例主要特点
公共varName公共成员可以从任何地方访问(类内部和外部)self.varName
  • Python 中的默认访问修饰符。
  • 对公共属性和方法的访问或修改没有限制。
Protected_varName受保护的成员可以在类和子类中访问(它不强制执行此限制;它只提供约定)self._varName
  • 使用单个下划线 (_) 指示。
  • 属性和方法可以从类外部访问;但是,应将其视为内部。
私有__varName私有成员只能在类内部访问(我们也可以应用名称修饰来访问成员)self.__varName
  • 使用双下划线 (__) 指示。
  • 我们不能直接从类外部访问私有成员。
  • 可以使用名称修饰访问属性和方法。(例如,_ClassName__varName)

结论

在上面的教程中,我们学习了面向对象编程的基础知识。我们还讨论了 OOP 的不同原则。然后我们详细理解了封装的概念。我们了解到,作为 OOP 的一个基本原则,封装有助于保护数据并确保对类属性和方法的受控访问。Python 提供三种访问修饰符来实现程序中的封装。这些访问修饰符(公共、受保护和私有)允许程序员管理数据可见性和安全性。

Python 访问修饰符常见问题解答

1. Python 中的访问修饰符是什么?

访问修饰符用于修改类成员变量和方法在类外部的访问权限。

2. Python 支持哪些访问修饰符?

Python 提供三种级别的访问修饰符

  1. 公共 (name):公共访问修饰符的成员可以在任何地方访问。
  2. 受保护 (_name):受保护访问修饰符的成员应仅在类及其子类内部访问。它不适用于公共用途。
  3. 私有 (__name):私有访问修饰符的成员只能在类内部(使用名称修饰)访问。

3. Python 中的受保护成员是什么?

受保护成员由单个下划线 (_variable) 指示。Python 解释器不像其他语言那样强制执行此限制;它仅为程序员指定,因为他们会尝试使用普通名称访问它,而不是通过相应的名称前缀调用。

4. Python 中的私有成员是什么?

私有成员由双下划线 (__variable) 指示。它不能直接从类外部访问。

5. 私有变量可以在类外部访问吗?

是的,但只能通过名称修饰 (_ClassName__variable) 访问。这不被推荐,因为私有成员仅用于类内部使用