Python基础:面向对象编程 (OOP)
Python基础:面向对象编程(OOP)
Lesson 5 of 7 • 10 XP
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() 中一样完全正常。
何时使用私有成员
当你:
- 希望防止类内部部分被误用时。
- 需要控制数据的访问或修改(常与getter和setter方法配合使用)。
- 想要清晰区分类的公共API(供外部使用)和实现细节。
总结
Python中的私有成员:
- 以
__(双下划线)开头。 - 仅供内部使用。
- 仍可通过名称重整访问,但你应尊重它们的私密性。
它们是对其他程序员(以及未来的你自己)发出的信号,告诉你哪些是安全使用的,哪些是以后可能无预警更改的内部细节。