# 运算符相关的魔术方法

运算符相关的魔术方法实在太多了,j就大概列举下面两类：

## 1、比较运算符

| 魔术方法                   | 说明                                                                                                                                                                         |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `__cmp__(self, other)` | 如果该方法返回负数，说明 `self < other`; 返回正数，说明 `self > other`; 返回 0 说明 `self == other` 。强烈不推荐来定义 `__cmp__` , 取而代之, 最好分别定义 `__lt__`, `__eq__` 等方法从而实现比较功能。 `__cmp__` 在 Python3 中被废弃了。 |
| `__eq__(self, other)`  | 定义了比较操作符 == 的行为                                                                                                                                                            |
| `__ne__(self, other)`  | 定义了比较操作符 != 的行为                                                                                                                                                            |
| `__lt__(self, other)`  | 定义了比较操作符 < 的行为                                                                                                                                                             |
| `__gt__(self, other)`  | 定义了比较操作符 > 的行为                                                                                                                                                             |
| `__le__(self, other)`  | 定义了比较操作符 <= 的行为                                                                                                                                                            |
| `__ge__(self, other)`  | 定义了比较操作符 >= 的行为                                                                                                                                                            |

来看个简单的例子就能理解了：

```python
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class Number(object):
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        print('__eq__')
        return self.value == other.value

    def __ne__(self, other):
        print('__ne__')
        return self.value != other.value

    def __lt__(self, other):
        print('__lt__')
        return self.value < other.value

    def __gt__(self, other):
        print('__gt__')
        return self.value > other.value

    def __le__(self, other):
        print('__le__')
        return self.value <= other.value

    def __ge__(self, other):
        print('__ge__')
        return self.value >= other.value


if __name__ == '__main__':
    num1 = Number(2)
    num2 = Number(3)
    print('num1 == num2 ? --------> {} \n'.format(num1 == num2))
    print('num1 != num2 ? --------> {} \n'.format(num1 == num2))
    print('num1 < num2 ? --------> {} \n'.format(num1 < num2))
    print('num1 > num2 ? --------> {} \n'.format(num1 > num2))
    print('num1 <= num2 ? --------> {} \n'.format(num1 <= num2))
    print('num1 >= num2 ? --------> {} \n'.format(num1 >= num2))

```

输出的结果为：

```txt
__eq__
num1 == num2 ? --------> False

__eq__
num1 != num2 ? --------> False

__lt__
num1 < num2 ? --------> True

__gt__
num1 > num2 ? --------> False

__le__
num1 <= num2 ? --------> True

__ge__
num1 >= num2 ? --------> False

```

## 2、算术运算符

| 魔术方法                        | 说明                                                                   |
| --------------------------- | -------------------------------------------------------------------- |
| `__add__(self, other)`      | 实现了加号运算                                                              |
| `__sub__(self, other)`      | 实现了减号运算                                                              |
| `__mul__(self, other)`      | 实现了乘法运算                                                              |
| `__floordiv__(self, other)` | 实现了 // 运算符                                                           |
| `___div__(self, other)`     | 实现了/运算符. 该方法在 Python3 中废弃. 原因是 Python3 中，division 默认就是 true division |
| `__truediv__(self, other)`  | 实现了 true division. 只有你声明了 `from __future__ import division` 该方法才会生效  |
| `__mod__(self, other)`      | 实现了 % 运算符, 取余运算                                                      |
| `__divmod__(self, other)`   | 实现了 divmod() 內建函数                                                    |
| `__pow__(self, other)`      | 实现了 `**` 操作. N 次方操作                                                  |
| `__lshift__(self, other)`   | 实现了位操作 `<<`                                                          |
| `__rshift__(self, other)`   | 实现了位操作 `>>`                                                          |
| `__and__(self, other)`      | 实现了位操作 `&`                                                           |
| `__or__(self, other)`       | 实现了位操作 \`                                                            |
| `__xor__(self, other)`      | 实现了位操作 `^`                                                           |

可以关注下公众号：

这个公号可能很少更新，但是一更新，就是把整理的一系列文章更新上去。

![](http://twowaterimage.oss-cn-beijing.aliyuncs.com/2019-10-14-WechatIMG697.jpeg)
