文章目录
- 一、运算符重载
一、运算符重载
运算符重载,是对已有的运算符进行重新定义,赋予其另一种功能,以适应不同的数据类型。运算符重载,是为了让用户自定义的对象能够使用中缀运算符(如+,-,*,&等)或一元运算符(如~)等。
Python 语言提供了运算符重载功能,增强了语言的灵活性。Python 语言本身提供了很多魔法方法,它的运算符重载就是通过重写这些 Python 内置魔法方法实现的。这些魔法方法都是以双下划线开头和结尾的,类似于__X__的形式,python 通过这种特殊的命名方式来拦截操作符,以实现重载。当 Python 的内置操作运用于类对象时,Python会去搜索并调用对象中指定的方法完成操作。
常见运算符重载方法
方法 | 重构 | 调用 |
| 构造函数 | 对象建立:X = Class(args) |
| 析构函数 | X对象收回 |
| 运算符+ | 如果没有 |
| 运算符(位OR) | 如果没有 |
| 打印,转换 | print(X), repr(X), str(X) |
| 函数调用 | X(*args, **kargs) |
| 点号运算 | X.undefined |
| 属性赋值语句 | X.any = value |
| 属性删除 | del X.any |
| 属性获取 | X.any |
| 索引运算 | X[key], X[i:j], 没 |
| 索引赋值语句 | X[key] = value, X[i:j] = sequence |
| 索引和分片删除 | del X[key], del X[i:j] |
| 长度 | len(X), 如果没有 |
| 布尔测试 | bool(X), 真测试(在python2.6中叫做_ |
| 特定比较 | X < Y, X > Y, X <= Y, X >= Y |
| 特定比较 | X == Y, X != Y |
| 右侧加法 | other + X |
| 实地(增强的)加法 | X += Y (or else add |
| 迭代环境 | I = iter(X), next(I); for loops, |
| 成员关系测试 | item in X(任何可迭代的对象) |
| 整数值 | hex(X), bin(X), oct(X), O[X], O[X:] |
| 环境管理器 | with obj as var: |
| 描述符属性 | X.attr, X.attr = value, del X.value |
| 描述符属性 | descr. |
| 创建 | 在 |
类可以重载加减运算、打印、函数调用、索引等内置运算,运算符重载使我们的对象的行为与内置对象的一样。Python 在调用操作符时会自动调用这样的方法,例如,如果类实现了__add__方法,当类的对象出现在+运算符中时会调用这个方法。
# 先看看原list加号运算符
>>> lst = list()
>>> lst.append(1)
>>> lst
[1]
>>> lst + [2]
>>> lst
[1, 2]
# 重构`+`号运算符方法__add__
class A(list):
def __add__(self, other):
print 'Hello, Python.'
>>> newlst = A()
>>> newlst.append(1)
>>> newlst + [2]
Hello, Python.
>>> newlst
[1]
我们在类A中重载了列表+号运算符的方法__add__,它只输出Hello, Python.,所以当我们类A的实例对象newlst调用+号运算符时,并没有像lst一样,添加新的成员,而只是输出字符串(这就是重构运算符方法)。