首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 13章 性能测量和大O算法分析
13.1 timeit模块
13.2 cProfile分析器
13.3 大O算法分析
13.4 大O阶
13.4.1 使用书架打比方描述大O阶
13.4.2 大O 测量的是最坏情况
13.5 确定代码的大O 阶
13.5.1 为什么低阶项和系数不重要
13.5.2 大O 分析实例
13.5.3 常见函数调用的大O 阶
13.5.4 一眼看出大O 阶
13.5.5 当n 很小时,大O并不重要,而n通常都很小
第 14章 项目实战
14.1 汉诺塔
14.1.1 汉诺塔输出
14.1.2 汉诺塔源代码
14.1.3 汉诺塔编写代码
14.2 四子棋
14.2.1 四子棋输出
14.2.2 四子棋源代码
14.2.3 四子棋编写代码
第 15章 面向对象编程和类
15.1 拿现实世界打比方:填写表格
15.2 基于类创建对象
15.3 创建一个简单的类——WizCoin
15.3.1 方法__init__()和self
15.3.2 特性
15.3.3 私有特性和私有方法
15.4 函数type()和特性__qualname__
15.5 非OOP 和OOP 的例子:井字棋
15.6 为现实世界设计类是一件难事儿
第 16章 面向对象编程和继承
16.1 继承的原理
16.1.1 重写方法
16.1.2 super()函数
16.1.3 倾向于组合而非继承
16.1.4 继承的缺点
16.2 函数isinstance()和issubclass()
16.3 类方法
16.4 类特性
16.5 静态方法
16.6 何时应该使用类和静态的面向对象特性
16.7 面向对象的行话
16.7.1 封装
16.7.2 多态性
16.8 何时不应该使用继承
16.9 多重继承
16.10 方法解析顺序
第 17章 Python 风格的面向对象编程:属性和魔术方法
17.1 属性
17.1.1 将特性转换为属性
17.1.2 使用setter 验证数据
17.1.3 只读属性
17.1.4 什么时候应该使用属性
17.2 Python 的魔术方法
17.2.1 字符串表示魔术方法
17.2.2 数值魔术方法
17.2.3 反射数值魔术方法
17.2.4 原地魔术方法
17.2.5 比较魔术方法
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(五)
小册名称:Python编程轻松进阶(五)
### 16.7.1 封装:Python中的高级编程概念 在Python编程的进阶之旅中,封装(Encapsulation)是一个至关重要的概念,它不仅是面向对象编程(OOP)的三大支柱之一(另外两个是继承和多态),也是构建可维护、可扩展且安全代码的关键。封装通过将对象的属性和方法组合成一个独立的单元,并限制对对象内部状态的直接访问,从而隐藏了对象的复杂性和实现细节,仅对外暴露有限的接口供外部使用。本章节将深入探讨Python中封装的原理、实现方式、优势以及在实际项目中的应用。 #### 1. 封装的基本原理 封装的核心思想是将数据(属性)与作用于这些数据的操作(方法)绑定在一起,形成一个不可分割的整体——类。这样做的好处在于,它允许我们定义清晰的接口来控制对数据的访问和修改,从而保护数据的完整性和安全性。通过封装,我们可以隐藏类的内部实现细节,只通过公共接口与外部世界交互,这有助于减少程序间的耦合度,提高代码的可重用性和可维护性。 #### 2. Python中的封装实践 在Python中,封装主要通过私有属性(属性名前加双下划线`__`)和公共方法(访问和修改私有属性的方法)来实现。虽然Python的私有属性并不是真正的私有(因为Python中的“私有”实际上是通过名称改写实现的,即`__attribute`会被改写为`_ClassName__attribute`),但它仍然是一种封装机制,用于提醒开发者这些属性或方法不应直接从类的外部访问。 **示例**: ```python class BankAccount: def __init__(self, owner, balance=0): self.__owner = owner # 私有属性 self.__balance = balance def deposit(self, amount): if amount > 0: self.__balance += amount else: print("Deposit amount must be positive.") def withdraw(self, amount): if 0 < amount <= self.__balance: self.__balance -= amount else: print("Insufficient funds or invalid amount.") def get_balance(self): return self.__balance # 使用BankAccount类 account = BankAccount("Alice", 100) account.deposit(50) print(account.get_balance()) # 正确方式获取余额 # print(account.__balance) # 尝试直接访问私有属性,会引发AttributeError ``` 在上面的例子中,`__owner`和`__balance`是私有属性,它们不能直接从类的外部访问或修改。相反,我们通过`deposit`、`withdraw`和`get_balance`这三个公共方法来操作这些私有属性。这种方式确保了数据的安全性和一致性,因为所有对数据的修改都必须通过类定义的方法来进行。 #### 3. 封装的优势 - **数据隐藏**:封装隐藏了类的内部实现细节,只通过公共接口与外界交互,减少了外部对内部状态的依赖,提高了代码的安全性和稳定性。 - **接口控制**:通过封装,我们可以精确地控制哪些数据可以被访问,哪些操作可以被执行,从而实现对数据的严格管理。 - **灵活性和可扩展性**:封装使得类的内部实现可以在不改变其外部接口的情况下进行修改和扩展,降低了维护成本,提高了代码的可重用性。 - **代码清晰**:封装有助于将复杂的逻辑封装在类内部,使得代码结构更加清晰,易于理解和维护。 #### 4. 封装与Python的`@property`装饰器 在Python中,除了使用传统的getter和setter方法外,我们还可以使用`@property`装饰器来更优雅地实现封装。`@property`允许我们将类的属性访问器定义为方法,但在外部代码看来,这些访问器就像普通的属性一样被访问和赋值。 **示例**: ```python class Circle: def __init__(self, radius): self.__radius = radius @property def radius(self): return self.__radius @radius.setter def radius(self, value): if value > 0: self.__radius = value else: raise ValueError("Radius must be positive") @property def area(self): return 3.14 * self.__radius ** 2 # 使用Circle类 circle = Circle(5) print(circle.radius) # 访问半径 circle.radius = 10 # 修改半径 print(circle.area) # 访问面积 ``` 在这个例子中,`radius`既是一个属性,又是一个可以通过`@property`和`@radius.setter`装饰器控制访问的方法。这种方式使得属性访问和修改更加灵活和安全。 #### 5. 封装在实际项目中的应用 在实际项目中,封装的应用非常广泛。无论是构建大型软件系统还是编写小型脚本,封装都是提高代码质量和可维护性的重要手段。通过封装,我们可以将复杂的逻辑和数据处理过程隐藏在类的内部,只通过简单的接口对外提供服务。这不仅可以降低系统的复杂度,还可以提高系统的稳定性和安全性。 例如,在开发一个Web应用程序时,我们可以将数据库访问逻辑封装在数据访问对象(DAO)中,通过公共接口提供数据查询和更新服务。这样,即使数据库的结构或查询逻辑发生变化,只要接口保持不变,就不会影响到应用程序的其他部分。 #### 6. 结论 封装是面向对象编程中的一个核心概念,它通过将数据和操作数据的方法封装成一个整体,实现了对数据的隐藏和保护。在Python中,封装主要通过私有属性和公共方法来实现,同时也可以使用`@property`装饰器来提供更灵活的属性访问控制。封装不仅提高了代码的安全性和稳定性,还增强了代码的可重用性和可维护性。在实际项目中,我们应该充分利用封装的思想来构建高质量的代码。
上一篇:
16.7 面向对象的行话
下一篇:
16.7.2 多态性
该分类下的相关小册推荐:
Python合辑7-集合、列表与元组
剑指Python(磨刀不误砍柴工)
Python3网络爬虫开发实战(下)
Python与办公-玩转PPT
Python合辑9-判断和循环
Python高并发编程与实战
Python编程轻松进阶(二)
Python高性能编程与实战
Python合辑3-字符串用法深度总结
Python数据分析与挖掘实战(上)
Python合辑12-面向对象
Python编程轻松进阶(三)