Python内置方法详解(2)

  举个例子,假如我们想用一个类来存储单词。我们可能想按照字典序(字母顺序)来比较单词,字符串的默认比较行为就是这样。我们可能也想按照其他规则来比较字符串,像是长度,或者音节的数量。在这个例子中,我们使用长度作为比较标准,下面是一种实现:

class Word(str): '''单词类,按照单词长度来定义比较行为''' def __new__(cls, word): # 注意,我们只能使用 __new__ ,因为str是不可变类型 # 所以我们必须提前初始化它(在实例创建时) if ' ' in word: print "Value contains spaces. Truncating to first space." word = word[:word.index(' ')] # Word现在包含第一个空格前的所有字母 return str.__new__(cls, word) def __gt__(self, other): return len(self) > len(other) def __lt__(self, other): return len(self) < len(other) def __ge__(self, other): return len(self) >= len(other) def __le__(self, other): return len(self) <= len(other)

  现在我们可以创建两个 Word 对象( Word(‘foo’) 和 Word(‘bar’))然后根据长度来比较它们。注意我们没有定义 __eq__ 和 __ne__ ,这是因为有时候它们会导致奇怪的结果(很明显, Word(‘foo’) == Word(‘bar’) 得到的结果会是true)。根据长度测试是否相等毫无意义,所以我们使用 str 的实现来比较相等

  从上面可以看到,不需要实现所有的比较魔法方法,就可以使用丰富的比较操作。标准库还在 functools 模块中提供了一个类装饰器,只要我们定义 __eq__ 和另外一个操作符( __gt__, __lt__ 等),它就可以帮我们实现比较方法。这个特性只在 Python 2.7 中可用。当它可用时,它能帮助我们节省大量的时间和精力。要使用它,只需要它 @total_ordering 放在类的定义之上就可以了

  3.2. 数值操作符

  就像你可以使用比较操作符来比较类的实例,你也可以定义数值操作符的行为。固定好你的安全带,这样的操作符真的有很多。看在组织的份上,我把它们分成了五类:一元操作符,常见算数操作符,反射算数操作符(后面会涉及更多),增强赋值操作符,和类型转换操作符。

  3.2.1. 一元操作符

  一元操作符只有一个操作符。

  __pos__(self)

  实现取正操作,例如 +some_object。

  __neg__(self)

  实现取负操作,例如 -some_object。

  __abs__(self)

  实现内建绝对值函数 abs() 操作。

  __invert__(self)

  实现取反操作符 ~。

  __round__(self, n)

  实现内建函数 round() ,n 是近似小数点的位数。

  __floor__(self)

  实现 math.floor() 函数,即向下取整。

  __ceil__(self)

  实现 math.ceil() 函数,即向上取整。

  __trunc__(self) 

  实现 math.trunc() 函数,即距离零最近的整数。

  3.2.2. 常见算数操作符

  现在,我们来看看常见的二元操作符(和一些函数),像+,-,*之类的,它们很容易从字面意思理解。

  __add__(self, other)

  实现加法操作。

  __sub__(self, other)

  实现减法操作。

  __mul__(self, other)

  实现乘法操作。

  __floordiv__(self, other)

  实现使用 // 操作符的整数除法。

  __div__(self, other)

  实现使用 / 操作符的除法。

  __truediv__(self, other)

  实现 _true_ 除法,这个函数只有使用 from __future__ import division时才有作用。

  __mod__(self, other)

  实现 % 取余操作。

  __divmod__(self, other)

  实现 divmod 内建函数。

  __pow__

  实现 ** 操作符。

  __lshift__(self, other)

  实现左移位运算符 << 。

  __rshift__(self, other)

  实现右移位运算符 >> 。

  __and__(self, other)

  实现按位与运算符 & 。

  __or__(self, other)

  实现按位或运算符 | 。

  __xor__(self, other)

  实现按位异或运算符 ^ 。

  3.2.3. 反射算数运算符

  还记得刚才我说会谈到反射运算符吗?可能你会觉得它是什么高端霸气上档次的概念,其实这东西挺简单的,下面举个例子:

some_object + other

  这是“常见”的加法,反射是一样的意思,只不过是运算符交换了一下位置:

other + some_object

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b955b7ea058f3baffa168301f7ce90bd.html