Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

在面向对象编程中,并非所有数据和方法都应该被外部直接访问。有时你希望隐藏内部细节,使它们只能在类内部使用。

在Python中,你可以通过给属性或方法的名字前加两个下划线__)来表示它是私有的

虽然这并不意味着完全无法访问,但它会启用一个称为名称重整的特性,将属性名称在内部更改,使其更难从外部访问。


为什么使用私有成员?

私有属性和方法:

  • 有助于保护数据不被意外修改。
  • 明确指出类的哪些部分是内部的,不应被外部代码依赖。
  • 允许你更改内部实现而不破坏其他使用该类的代码。

重要提示:Python中的私有是约定而非强制。如果有人真的想访问私有成员,仍然可以,但意图是你不应该这样做。


示例:一个 Person 类

class Person:
    def __init__(self, name, age):
        self.name = name          # 公共属性
        self.__age = age          # 私有属性

    def print_name(self):
        print("Name:", self.name)

    def print_info(self):
        self.print_name()
        self.__print_age()        # 从类内部调用私有方法

    def __print_age(self):        # 私有方法
        print("Age:", self.__age)

p = Person("John", 30)

p.print_name()        # 可用: Name: John
p.print_info()        # 可用: Name: John  Age: 30

如果你尝试访问私有属性,会发生什么?

如果你试图从类外部直接访问私有成员,会得到一个 AttributeError

p = Person("John", 30)
print(p.__age)  # ❌ 会导致错误

为什么? 因为Python会自动将 __age 的名字内部改成 _Person__age(名称重整)。这有助于避免意外访问或与子类冲突。


访问私有数据(如果你确实需要)

技术上,你可以通过使用重整后的名称访问私有成员:

print(p._Person__age)  # 30

但这破坏了保持私有的初衷——你只应在调试等少数情况下这样做,正常程序逻辑下不应如此。


私有方法

和属性一样,方法也可以用双下划线变为私有。在我们的例子中,__print_age() 是私有的——你不能从类外部调用它:

p.__print_age()  # ❌ 会导致错误

但它在类内部调用像 print_info() 中一样完全正常。

何时使用私有成员

当你:

  • 希望防止类内部部分被误用时。
  • 需要控制数据的访问或修改(常与gettersetter方法配合使用)。
  • 想要清晰区分类的公共API(供外部使用)和实现细节

总结

Python中的私有成员:

  • __(双下划线)开头。
  • 仅供内部使用
  • 仍可通过名称重整访问,但你应尊重它们的私密性。

它们是对其他程序员(以及未来的你自己)发出的信号,告诉你哪些是安全使用的,哪些是以后可能无预警更改的内部细节。