大家好,欢迎来到IT知识分享网。
定义运算符
以加法运算符 “ + ” 为例,不仅仅用于数字,还可以用于序列,比如:
>>> 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中列出了几种常见运算符所对应的特殊方法,供读者参考。
运算符和方法名称
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/50834.html