首页
技术小册
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.2 数值魔术方法 在Python中,对象的行为不仅由其数据(属性)定义,还由其方法(尤其是特殊方法,又称“魔术方法”)控制。这些魔术方法提供了对象之间交互的默认行为,特别是在执行数学运算、比较、字符串表示等方面。对于数值类型或需要模拟数值行为的类来说,理解和正确使用数值魔术方法至关重要。本章将深入探讨Python中的数值魔术方法,帮助读者在自定义数值类型或需要数值操作的类时,能够轻松实现高效且符合直觉的数值处理功能。 #### 17.2.2.1 引言 数值魔术方法(Numeric Magic Methods)是Python中用于实现对象间数学运算(如加、减、乘、除)的一组特殊方法。它们以双下划线(`__`)开头和结尾,如`__add__`、`__sub__`等。通过定义这些魔术方法,我们可以让自定义的类支持Python内置的数学运算符,从而使代码更加简洁易读。 #### 17.2.2.2 基本数值魔术方法 ##### 1. 加法 (`__add__`) 当使用`+`运算符将两个对象相加时,Python会尝试调用第一个操作数的`__add__`方法,并将第二个操作数作为参数传递。如果第一个操作数没有定义`__add__`方法,则尝试反向操作,即调用第二个操作数的`__radd__`方法。 ```python class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) # 使用示例 v1 = Vector(1, 2) v2 = Vector(3, 4) v3 = v1 + v2 # 调用v1的__add__方法 print(v3.x, v3.y) # 输出: 4 6 ``` ##### 2. 减法 (`__sub__`) 减法操作类似于加法,但调用的是`__sub__`方法,并且如果存在`__rsub__`,则用于反向操作。 ##### 3. 乘法 (`__mul__`) 乘法操作通过`__mul__`方法实现,同样支持反向操作`__rmul__`。 ##### 4. 除法 (`__truediv__` 和 `__floordiv__`) Python区分了真除法(`/`,调用`__truediv__`)和地板除法(`//`,调用`__floordiv__`)。真除法返回浮点数结果,而地板除法返回整数结果(向下取整)。 ##### 5. 取模 (`__mod__`) 取模操作(`%`)通过`__mod__`方法实现,常用于求余数。 ##### 6. 幂运算 (`__pow__`) 幂运算(`**`)通过`__pow__`方法实现,支持任意次幂的计算。 #### 17.2.2.3 增强型数值魔术方法 除了基本的数值操作外,Python还提供了一系列增强型数值魔术方法,用于支持原地(in-place)操作,即在原有对象上直接修改,而不是创建新对象。 ##### 1. 加法原地操作 (`__iadd__`) `__iadd__`方法用于实现`+=`运算符的原地加法操作。如果定义了`__iadd__`,则`a += b`将尝试调用`a.__iadd__(b)`。 ##### 2. 减法原地操作 (`__isub__`) 类似地,`__isub__`用于实现`-=`运算符的原地减法操作。 ##### 3. 其他原地操作 其他原地操作包括`__imul__`(原地乘法)、`__itruediv__`(原地真除法)、`__ifloordiv__`(原地地板除法)、`__imod__`(原地取模)和`__ipow__`(原地幂运算)。 #### 17.2.2.4 数值魔术方法与操作符重载 通过定义数值魔术方法,我们可以实现操作符重载(Operator Overloading),即让自定义的对象类型支持Python内置的运算符。这极大地增强了代码的可读性和易用性,使得自定义类型的对象可以像内置类型一样进行数学运算。 然而,操作符重载也需要谨慎使用,以避免混淆和错误。特别是在设计公共库或框架时,应当考虑到代码的可读性和维护性,避免使用容易引起误解的操作符重载。 #### 17.2.2.5 注意事项 1. **返回类型**:在定义数值魔术方法时,应确保返回的类型与操作数类型一致或兼容。例如,在自定义的向量类中,加法操作应返回一个新的向量对象。 2. **反向操作**:当自定义类型与内置类型或其他自定义类型进行运算时,应确保提供了适当的反向操作方法(如`__radd__`、`__rmul__`等),以支持所有可能的组合。 3. **错误处理**:在数值魔术方法中,应妥善处理可能出现的错误和异常情况,以避免程序崩溃或产生不可预测的结果。 4. **性能考虑**:在性能敏感的应用中,应注意数值魔术方法的执行效率。例如,在可能的情况下,使用原地操作可以减少不必要的对象创建和内存分配。 #### 17.2.2.6 实战案例:分数类 为了更好地理解数值魔术方法的应用,我们可以实现一个简单的分数类(Fraction),该类支持加、减、乘、除等基本数学运算。 ```python class Fraction: def __init__(self, numerator, denominator=1): self.numerator = numerator self.denominator = denominator self.simplify() def simplify(self): # 简化分数 gcd = math.gcd(self.numerator, self.denominator) self.numerator //= gcd self.denominator //= gcd def __add__(self, other): if not isinstance(other, Fraction): return NotImplemented new_numerator = self.numerator * other.denominator + self.denominator * other.numerator new_denominator = self.denominator * other.denominator return Fraction(new_numerator, new_denominator) # 省略其他魔术方法的实现... # 使用示例 f1 = Fraction(1, 2) f2 = Fraction(1, 4) f3 = f1 + f2 # 调用f1的__add__方法 print(f3.numerator, f3.denominator) # 输出: 3 4 ``` 通过上述代码,我们定义了一个基本的分数类,并通过实现数值魔术方法使其支持加法运算。类似地,我们可以为分数类添加减法、乘法、除法等魔术方法的实现,以支持更多的数学运算。 #### 17.2.2.7 总结 数值魔术方法是Python中实现对象间数学运算的重要机制。通过定义这些特殊方法,我们可以让自定义的类支持Python内置的运算符,从而编写出更加简洁、直观和高效的代码。然而,在使用数值魔术方法时,也需要注意其潜在的风险和限制,以确保代码的正确性和可读性。希望本章的内容能够帮助读者更好地理解数值魔术方法,并在实际编程中灵活运用它们。
上一篇:
17.2.1 字符串表示魔术方法
下一篇:
17.2.3 反射数值魔术方法
该分类下的相关小册推荐:
Python合辑3-字符串用法深度总结
Python爬虫入门与实战开发(上)
Python与办公-玩转Excel
Python合辑8-变量和运算符
机器学习算法原理与实战
Python合辑11-闭包函数
Python编程轻松进阶(四)
Python甚础Django与爬虫
Python合辑7-集合、列表与元组
Python与办公-玩转PDF
Python合辑10-函数
Python神经网络入门与实践