网站首页 > 基础教程 正文
定义运算符
以加法运算符 “ + ” 为例,不仅仅用于数字,还可以用于序列,比如:
>>> 2 + 3
5
>>> 'python' + "book"
'pythonbook'
如果考察能够用于 “ + ” 的对象,会发现它们都必须有 __add__() 方法,否则(如下操作中的字典类型)就不能实现 “ + ” 运算。
>>> hasattr(2, "__add__")
True
>>> hasattr("python", "__add__")
True
>>> hasattr(list, "__add__")
True
>>> hasattr(dict, "__add__")
False
>>> {1:2} + {3:4}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
所以,在自定义的对象类型中,如果也重写了 __add__() 方法,就会按照指定规则进行 + 运算。
在9.1.2节创建的 fraction.py 已有代码基础上,可以继续对分数问题进行研究,考虑分数相加,以此说明 __add__() 方法的编写和应用。
先复习一下分数加法的计算过程(以 为例):
(1)通分,即分母为原来两个分数的分母的最小公倍数,得到 。
(2)分子相加,得到上述两个分数的和。
据此可知,计算分数加法的关键点是“通分”,而通分的关键是找出两个整数的最小公倍数。
如何找最小公倍数?步骤如下:
(1)计算两个数的最大公约数,假设 a 和 b 两个整数,最大公约数(Greatest Common Divisor)用 gcd(a, b) 表示。
(2)最小公倍数和最大公约数的关系是:lcm(a, b) = |ab| / gcd(a, b) ,lcm(a, b) 表示这两个数的最小公倍数(Lowest Common Multiple)。
按照上面所列的方法,增加计算最大公约数和最小公倍数的静态方法——请读者思考,为什么要用静态方法?然后重写特殊方法 __add__() ,即实现了分数加法。详细代码示例如下:
#coding=utf-8
'''
filename: fraction.py
'''
class Fraction:
def __init__(self, number, denom=1):
self.number = number
self.denom = denom
def __str__(self):
return str(self.number) + '/' + str(self.denom)
__repr__ = __str__
@staticmethod
def gcd(a, b):
if not a > b:
a, b = b, a
while b != 0:
remainder = a % b
a, b = b, remainder
return a
@staticmethod
def lcm(a, b):
return (a * b) / Fraction.gcd(a, b)
def __add__(self, other):
lcm_num = Fraction.lcm(self.denom, other.denom)
number_sum = (lcm_num / self.denom * self.number) \
+ (lcm_num / other.denom * other.number)
return Fraction(number_sum, lcm_num)
if __name__ == "__main__":
m = Fraction(1, 3)
n = Fraction(1, 2)
print(m + n)
以上代码内容不再解释,留给读者对其进行注释,以便练习解读代码的能力——其中各个方法的基本原理参阅之前所学内容。
除了加法运算符之外,其他运算符也都有相应的特殊方法,如有必要,可以在类中重写这些特殊方法,以实现有关计算。表9-1-1中列出了几种常见运算符所对应的特殊方法,供读者参考。
运算符和方法名称
猜你喜欢
- 2024-10-30 30 个 Python常用的语法汇总! python常用方法大全
- 2024-10-30 Python解小学奥数的数学题 python算数学题
- 2024-10-30 浅学Python | 案列分析(下) python案例分析
- 2024-10-30 30个常用Python实现,新手必备! python的妙用
- 2024-10-30 Python基础教程:Day04-循环结构 python循环结构有哪些
- 2024-10-30 结了30个Python常用基础语法,希望对你们有帮助!
- 2024-10-30 「LeetCode算法精讲」计算小于n的质数数量(Python)
- 2024-10-30 Python基础教程:Day06-函数和模块的使用
- 2024-10-30 Python 100天从新手到大师 | Day 6 函数和模块使用
- 2024-10-30 初学Python最简易入门之十六小程序集锦
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)