首页
技术小册
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.2.3 反射数值魔术方法 在Python的编程世界中,魔术方法(Magic Methods)或称为特殊方法,是那些以双下划线(`__`)开头和结尾的方法。这些方法为Python对象定义了内置的“魔法”,允许对象进行特定的操作,如数值计算、比较、字符串表示等,而无需显式地编写这些操作的代码。在Python的高级编程中,理解和掌握这些魔术方法对于提升代码的可读性、复用性和效率至关重要。本章节将深入探讨与数值操作相关的反射魔术方法,特别是那些与数值计算、类型转换和反射操作紧密相关的方法。 #### 17.2.3.1 数值魔术方法概览 在Python中,处理数值类型(如整数、浮点数、复数等)时,一系列魔术方法允许对象在进行数学运算时表现出特定的行为。这些魔术方法包括但不限于: - `__add__(self, other)`: 定义加法操作。 - `__sub__(self, other)`: 定义减法操作。 - `__mul__(self, other)`: 定义乘法操作。 - `__truediv__(self, other)`: 定义真除法(Python 3中的除法)。 - `__floordiv__(self, other)`: 定义地板除法(向下取整)。 - `__mod__(self, other)`: 定义取模操作。 - `__pow__(self, other[, modulo])`: 定义幂运算,可选地支持模幂运算。 - `__neg__(self)`: 定义负号操作。 - `__pos__(self)`: 定义正号操作(通常不做任何改变,但可用于特殊目的)。 - `__abs__(self)`: 定义绝对值操作。 - `__round__(self, ndigits=None)`: 定义四舍五入操作,`ndigits`指定小数点后的位数。 此外,还有一些与类型转换相关的魔术方法,如`__int__()`, `__float__()`, `__complex__()`等,它们允许对象被转换为相应的数值类型。 #### 17.2.3.2 反射与数值魔术方法的结合 “反射”在Python中通常指的是程序能够检查或修改其自身结构(如对象类型、属性等)的能力。虽然直接的“反射”与数值魔术方法之间可能没有直接的关联(因为数值操作通常不涉及对象结构的动态修改),但我们可以从更广义的角度来理解反射在数值操作中的应用:即如何通过魔术方法让对象“智能”地处理不同类型的数值输入,以及如何在不修改原有代码的情况下扩展或修改这些行为。 ##### 示例:动态数值类型处理 假设你正在开发一个金融计算库,其中包含一个`Money`类,用于表示货币金额。你可能希望`Money`对象能够与其他数值类型(如整数、浮点数)以及同类对象进行加减乘除等操作。通过实现上述的数值魔术方法,你可以让`Money`对象表现出预期的数学行为。 ```python class Money: def __init__(self, amount, currency='USD'): self.amount = amount self.currency = currency def __add__(self, other): if isinstance(other, Money) and self.currency == other.currency: return Money(self.amount + other.amount, self.currency) elif isinstance(other, (int, float)): return Money(self.amount + other, self.currency) else: raise TypeError("Unsupported operand type(s) for +: '{}' and '{}'".format( type(self).__name__, type(other).__name__)) # 类似地,实现__sub__, __mul__, __truediv__等方法 def __repr__(self): return f"{self.amount} {self.currency}" ``` 在这个例子中,`Money`类通过实现`__add__`等魔术方法,能够智能地处理与不同类型数值的加法操作。这种设计体现了反射的一种形式——即根据传入对象的类型动态地决定执行的操作。 #### 17.2.3.3 进阶应用:运算符重载与自定义行为 Python的魔术方法允许开发者“重载”Python的内置运算符,为自定义类型赋予新的行为。这种能力极大地增强了Python的灵活性和表达能力。通过精心设计的数值魔术方法,开发者可以创建出既符合直觉又功能强大的数值类型。 例如,你可以创建一个`Vector`类来表示二维或三维向量,并通过实现`__add__`、`__sub__`、`__mul__`等魔术方法,让向量之间可以进行加法、减法、点乘和叉乘等操作。此外,你还可以为这些操作添加额外的检查(如确保向量维度一致),以确保操作的合法性和结果的正确性。 ```python class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): if isinstance(other, Vector): return Vector(self.x + other.x, self.y + other.y) else: raise TypeError("Unsupported operand type(s) for +: '{}' and '{}'".format( type(self).__name__, type(other).__name__)) # 实现其他魔术方法以支持减法、点乘等 def __repr__(self): return f"Vector({self.x}, {self.y})" ``` #### 17.2.3.4 结论 通过深入理解并巧妙运用Python的数值魔术方法,开发者可以创建出既灵活又强大的数值类型,这些类型能够无缝地融入Python的数值计算生态中,同时保持高度的自定义性和可扩展性。此外,这种对数值魔术方法的掌握也是编写高质量、易于维护的Python代码的关键之一。希望本章节的内容能够为你在Python编程进阶之路上提供有力的帮助。
上一篇:
17.2.2 数值魔术方法
下一篇:
17.2.4 原地魔术方法
该分类下的相关小册推荐:
机器学习算法原理与实战
Python合辑10-函数
Python合辑6-字典专题
Python合辑12-面向对象
Python机器学习实战
Python机器学习基础教程(下)
Python与办公-玩转Word
Python爬虫入门与实战开发(下)
Python合辑4-130个字符串操作示例
Python合辑13-面向对象编程案例(上)
Python合辑14-面向对象编程案例(下)
Python合辑7-集合、列表与元组