Python 中的封装
Python 中的封装
封装是面向对象编程的三大核心特性之一(另外两个是继承和多态)。它主要有两个目的:
- 将数据(属性)和行为(方法)捆绑在一起,形成一个独立的、内聚的对象。
- 对外部隐藏对象的内部实现细节,只提供一个可控的访问接口。这可以防止外部代码直接意外修改内部数据,增强了安全性和可维护性。
Python 中的封装并不像 C++ 或 Java 那样严格(通过 private
, protected
等关键字强制实现),它更多地依赖于一种叫做 “名称改写” 的约定和编程规范。
一、封装的实现层次
Python 通过命名约定来实现不同级别的访问控制。
1. 公开成员
-
定义:任何类成员(属性或方法),其名称以字母开头,且没有下划线或只有一个下划线前缀(这属于约定,并非强制)。
-
访问:可以在类的外部、子类中直接被访问和修改。
-
示例:
class Car:def __init__(self, brand, model):self.brand = brand # 公开属性self.model = model # 公开属性self._engine_rpm = 0 # 保护属性(单下划线,只是一种约定)# 公开方法def start_engine(self):self._engine_rpm = 800print("Engine started.")def get_info(self):return f"{self.brand} {self.model}"my_car = Car("Toyota", "Corolla") print(my_car.brand) # 直接访问:Toyota my_car.brand = "Honda" # 直接修改:Honda my_car.start_engine() # 调用公开方法
2. 保护成员
-
定义:在成员名称前加一个下划线
_
,例如_protected_attr
。 -
本质:这仅仅是一个约定!Python 解释器不会阻止你在类的外部访问它。它是一种对程序员的说:“嘿,这个属性或方法是内部使用的,不建议你直接从外部访问,因为它可能在未来版本中改变。”
-
目的:提示其他开发者这是一个仅供内部或子类使用的成员,应通过公共接口来操作。
-
示例:
class Car:def __init__(self):self._mileage = 0 # 保护属性def _update_mileage(self, km): # 保护方法self._mileage += kmprint(f"Mileage updated to {self._mileage}km")def drive(self, km): # 公开方法,内部使用保护方法# ... 一些驾驶逻辑 ...self._update_mileage(km)my_car = Car() my_car.drive(50) # 正确方式:通过公共接口drive来间接修改_mileage print(