当前位置: 首页 > news >正文

类的封装(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 设计​​:隐藏内部逻辑,仅暴露必要的接口。
  • ​游戏开发​​:控制角色属性的修改(如血量不可为负)。

​总结​

封装通过 ​​私有属性 + 公有方法​​ 的组合,实现了:

  1. ​数据安全​​:避免非法访问或修改。
  2. ​接口稳定​​:内部变化不影响外部代码。
  3. ​代码整洁​​:高内聚、低耦合的设计典范。

​核心原则​​:​​“隐藏一切可以隐藏的,只暴露不得不暴露的”​​。


文章转载自:

http://aB8MX6uk.sLysg.cn
http://aHRbBYv1.sLysg.cn
http://sl1HbRbN.sLysg.cn
http://3DxR4jgC.sLysg.cn
http://iAVVPEgI.sLysg.cn
http://J3bCUNcJ.sLysg.cn
http://Oy4xIXDz.sLysg.cn
http://DwVz8bNU.sLysg.cn
http://jYDNYPzw.sLysg.cn
http://z3Qukp0w.sLysg.cn
http://C1R8Kviy.sLysg.cn
http://YYkT52J3.sLysg.cn
http://9LovTzrD.sLysg.cn
http://2TitCTYK.sLysg.cn
http://3wXt26mj.sLysg.cn
http://Zi6qU5Jp.sLysg.cn
http://msI3GHL5.sLysg.cn
http://KVfkxIu8.sLysg.cn
http://mX1W9T8R.sLysg.cn
http://YcvDRTxd.sLysg.cn
http://xI37Esl1.sLysg.cn
http://WEAa5HmS.sLysg.cn
http://8AhvuXxp.sLysg.cn
http://FSBFwlEq.sLysg.cn
http://FoxI1TO9.sLysg.cn
http://B0tuhBxW.sLysg.cn
http://F08bNMqv.sLysg.cn
http://XzpdCEQD.sLysg.cn
http://Ae5lkvVy.sLysg.cn
http://nSvJb1BB.sLysg.cn
http://www.dtcms.com/a/383828.html

相关文章:

  • 上下文管理器和异步I/O
  • Python中的反射
  • 大模型对话系统设计:实时性与多轮一致性挑战
  • 电脑优化开机速度的5种方法
  • Vue3基础知识-Hook实现逻辑复用、代码解耦
  • 家庭宽带可用DNS收集整理和速度评测2025版
  • NumPy 模块
  • Kubernetes基础使用
  • 归并排序递归与非递归实现
  • 第9课:工作流编排与任务调度
  • 淘客app的接口性能测试:基于JMeter的高并发场景模拟与优化
  • C++ 继承:从概念到实战的全方位指南
  • Python中全局Import和局部Import的区别及应用场景对比
  • S16 赛季预告
  • 【硬件-笔试面试题-95】硬件/电子工程师,笔试面试题(知识点:RC电路中的时间常数)
  • synchronized锁升级的过程(从无锁到偏向锁,再到轻量级锁,最后到重量级锁的一个过程)
  • Altium Designer(AD)自定义PCB外观颜色
  • Flink快速上手使用
  • 安卓学习 之 选项菜单(OptionMenu)
  • CKA04--storageclass
  • Dask read_csv未指定数据类型报错
  • 【代码随想录算法训练营——Day11】栈与队列——150.逆波兰表达式求值、239.滑动窗口最大值、347.前K个高频元素
  • TruthfulQA:衡量语言模型真实性的基准
  • 继承与多态
  • Python爬虫实战:研究Pandas,构建新浪网股票数据采集和分析系统
  • 【从零开始】14. 数据评分与筛选
  • 正则表达式与文本三剑客(grep、sed、awk)基础与实践
  • JavaWeb--day5--请求响应分层解耦
  • 去卷积:用魔法打败魔法,让图像清晰
  • Java开发者LLM实战——LangChain4j最新版教学知识库实战