类的封装(Encapsulation)
类的封装(Encapsulation)
封装是面向对象编程(OOP)的三大核心特性之一,它通过隐藏对象的内部状态并仅暴露必要的操作接口,来实现数据的安全性和代码的模块化。以下是封装的要点:
1. 封装的核心思想
- 隐藏实现细节:将数据(属性)和操作数据的方法(行为)捆绑在类内部,外部代码无需知道内部如何实现。
- 暴露安全接口:通过公有方法(如
getter/setter
)控制对私有属性的访问,避免数据被直接修改或破坏。
2. 如何实现封装?
(1) 私有属性
在属性名前加双下划线 __
表示私有(实际会重命名为 _类名__属性名
):
class BankAccount:def __init__(self, balance):self.__balance = balance # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountdef get_balance(self): # 公有方法提供受控访问return self.__balanceaccount = BankAccount(1000)
account.deposit(500)
print(account.get_balance()) # 1500
# print(account.__balance) # 报错!无法直接访问私有属性
(2) 使用属性装饰器(@property)
更优雅地控制属性的读写:
class Person:def __init__(self, name):self.__name = name@propertydef name(self): # 读属性return self.__name@name.setterdef name(self, new_name): # 写属性(可添加校验逻辑)if isinstance(new_name, str):self.__name = new_nameelse:raise ValueError("姓名必须是字符串")p = Person("Alice")
p.name = "Bob" # 调用 setter
print(p.name) # 调用 getter,输出 "Bob"
3. 封装的优势
优点 | 说明 |
---|---|
数据保护 | 防止外部代码随意修改敏感数据(如账户余额、密码)。 |
灵活性 | 内部实现可自由修改(如更改存储方式),不影响外部调用。 |
降低复杂度 | 使用者只需关注“做什么”(接口),无需关心“怎么做”(实现)。 |
便于调试 | 错误通常发生在类的内部,易于定位问题。 |
4. 封装 vs 非封装
未封装的类(风险高)
class User:def __init__(self, password):self.password = password # 密码直接暴露user = User("123456")
user.password = "hacked!" # 可随意修改
封装的类(安全)
class SecureUser:def __init__(self, password):self.__password = password # 私有属性def set_password(self, new_pass):if len(new_pass) >= 6:self.__password = new_passdef verify(self, input_pass):return self.__password == input_passuser = SecureUser("123456")
user.set_password("short") # 无效(长度校验)
print(user.verify("123456")) # True
5. 实际应用场景
- 金融系统:保护账户余额、交易记录。
- API 设计:隐藏内部逻辑,仅暴露必要的接口。
- 游戏开发:控制角色属性的修改(如血量不可为负)。
总结
封装通过 私有属性 + 公有方法 的组合,实现了:
- 数据安全:避免非法访问或修改。
- 接口稳定:内部变化不影响外部代码。
- 代码整洁:高内聚、低耦合的设计典范。
核心原则:“隐藏一切可以隐藏的,只暴露不得不暴露的”。