首页
技术小册
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编程轻松进阶(五)
### 第 17章 Python 风格的面向对象编程:属性和魔术方法 在Python的面向对象编程(OOP)世界中,属性和魔术方法(也称为特殊方法或双下方法)是构建优雅、灵活且易于维护代码的关键元素。本章将深入探讨如何在Python中有效利用这些特性,以编写出既符合Pythonic风格又高效强大的代码。 #### 17.1 深入理解Python属性 在Python中,属性是类实例的变量,它们存储了对象的状态信息。然而,Python的属性系统远比简单的变量赋值要复杂和强大。通过使用属性装饰器(如`@property`),我们可以将方法伪装成属性,从而在访问属性时执行自定义逻辑,如计算值、类型检查或日志记录。 ##### 17.1.1 使用`@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: raise ValueError("Radius cannot be negative") self._radius = value @property def area(self): return math.pi * self._radius ** 2 # 使用 circle = Circle(5) print(circle.radius) # 访问半径 print(circle.area) # 访问面积,无需调用方法 circle.radius = 10 # 设置半径 print(circle.area) # 更新后的面积 ``` 在上面的例子中,`radius`被定义为一个可读写的属性,而`area`则是一个只读属性,通过计算得出。 ##### 17.1.2 属性删除器 除了`@property.setter`,Python还允许我们定义`@property.deleter`,用于处理属性的删除操作。虽然这在实际应用中不常见,但它为属性的管理提供了额外的灵活性。 ```python class MyClass: def __init__(self): self._my_property = None @property def my_property(self): return self._my_property @my_property.setter def my_property(self, value): self._my_property = value @my_property.deleter def my_property(self): del self._my_property # 使用 obj = MyClass() obj.my_property = 'Hello' print(obj.my_property) # 输出: Hello del obj.my_property try: print(obj.my_property) # 可能引发AttributeError except AttributeError: print("Property deleted") ``` #### 17.2 魔术方法:Python的幕后英雄 Python的魔术方法(又称特殊方法或双下方法)是一系列以双下划线(`__`)开头和结尾的方法,它们在对象生命周期的特定时刻被Python自动调用。这些方法让Python的类能够与Python解释器进行更紧密的交互,实现诸如对象的创建、初始化、属性访问、比较、迭代等高级功能。 ##### 17.2.1 构造与析构 - `__init__(self, ...)`: 类的初始化方法,在创建新实例时自动调用。 - `__new__(cls, ...)`: 类的实例化方法,通常不需要重写,除非需要控制对象的创建过程。 - `__del__(self)`: 对象的析构方法,当对象被销毁时自动调用,用于执行清理操作。注意,由于Python的垃圾回收机制,`__del__`的调用时机并不总是可预测的。 ##### 17.2.2 字符串与字节序列表示 - `__str__(self)`: 返回对象的“非正式”或可读的字符串表示,通常用于`print()`函数。 - `__repr__(self)`: 返回对象的“正式”字符串表示,旨在是唯一的、可评估的,通常用于`repr()`函数。 - `__format__(self, format_spec)`: 允许对象支持字符串的格式化操作。 ##### 17.2.3 容器类型方法 - `__len__(self)`: 返回容器中元素的数量,适用于序列和集合类型。 - `__getitem__(self, key)`: 根据键获取容器中的元素,支持索引、切片等操作。 - `__setitem__(self, key, value)`: 将值赋给容器中的指定键。 - `__delitem__(self, key)`: 从容器中删除指定键的元素。 - `__iter__(self)`: 返回一个迭代器对象,支持迭代协议。 - `__contains__(self, item)`: 检查容器中是否包含某个元素,用于`in`和`not in`操作。 ##### 17.2.4 比较方法 - `__lt__(self, other)`: 小于(<) - `__le__(self, other)`: 小于等于(<=) - `__eq__(self, other)`: 等于(==) - `__ne__(self, other)`: 不等于(!=) - `__gt__(self, other)`: 大于(>) - `__ge__(self, other)`: 大于等于(>=) 这些方法定义了对象之间的比较行为,是实现排序和去重等功能的基础。 ##### 17.2.5 上下文管理器 - `__enter__(self)`: 进入运行时上下文,返回对象的上下文管理器。 - `__exit__(self, exc_type, exc_val, exc_tb)`: 退出运行时上下文,进行清理工作。 上下文管理器通过`with`语句简化了资源的获取与释放过程,如文件操作、数据库连接等。 #### 17.3 实践中的面向对象编程风格 在Python中编写优雅的面向对象代码,不仅需要掌握上述属性和魔术方法,还需要遵循一些最佳实践: - **明确职责**:确保每个类都有清晰的职责和边界。 - **封装**:隐藏内部实现细节,只通过公共接口与外界交互。 - **继承与组合**:谨慎使用继承,优先考虑组合。继承主要用于实现“是一个”的关系,而组合则用于实现“有一个”的关系。 - **多态**:利用Python的动态类型系统,通过接口(在Python中通常是抽象基类)实现多态。 - **遵循Pythonic风格**:利用Python的内置功能和特性,编写简洁、易读、高效的代码。 通过本章的学习,你应该能够更深入地理解Python中的属性和魔术方法,以及如何运用它们来编写出既符合Pythonic风格又高效强大的面向对象代码。记住,实践是检验真理的唯一标准,不妨动手尝试将所学应用到你的项目中,去体会面向对象编程的魅力吧!
上一篇:
16.10 方法解析顺序
下一篇:
17.1 属性
该分类下的相关小册推荐:
Python面试指南
剑指Python(万变不离其宗)
Python合辑2-字符串常用方法
Python机器学习基础教程(上)
Python与办公-玩转PDF
Python数据分析与挖掘实战(下)
Python3网络爬虫开发实战(上)
Python合辑9-判断和循环
Python高性能编程与实战
Python机器学习实战
Python合辑6-字典专题
Python甚础Django与爬虫