Python中常见运算符重载方法

在类中,对内置对象(例如:整数和列表)所能做的事,几乎都有相应的特殊名称的重载方法。最常见的就是重载类的构造函数(__init__函数)

方法 重构 调用
__init__ 构造函数 对象建立:X = Class(args)
__del__ 析构函数 X对象收回
__add__ 运算符+ 如果没有_iadd_, X + Y, X += Y
__or__ 运算符|(位OR) 如果没有 _ior_, X | Y, X |= Y
__repr__, __str__ 打印,转换 print(X), repr(X), str(X)
__call__ 函数调用 X(*args, **kargs)
__getattr__ 点号运算 X.undefined
__setattr__ 属性赋值语句 X.any = value
__delattr__ 属性删除 del X.any
__getattribute__ 属性获取 X.any
__getitem__ 索引运算 X[key], X[i:j], 没__iter__时的for循环和其他迭代器
__setitem__ 索引赋值语句 X[key] = value, X[i:j] = sequence
__delitem__ 索引和分片删除 del X[key], del X[i:j]
__len__ 长度 len(X), 如果没有__bool__, 真值测试
__bool__ 布尔测试 bool(X), 真测试(在python2.6中叫做_
__lt__, __gt__ 特定比较 X < Y, X > Y, X <= Y, X >= Y
__le__, __ge__ 特定比较 X == Y, X != Y
__radd__ 右侧加法 other + X
__iadd__ 实地(增强的)加法 X += Y (or else add
__iter__, __next__ 迭代环境 I = iter(X), next(I); for loops,
__contains__ 成员关系测试 item in X(任何可迭代的对象)
__index__ 整数值 hex(X), bin(X), oct(X), O[X], O[X:]
__enter__, __exit__ 环境管理器 with obj as var:
__get__, __set__ 描述符属性 X.attr, X.attr = value, del X.value
__delete__ 描述符属性 descr.__delete__(self, obj) –> None
__new__ 创建 在__init__之前创建对象

下面我们看一个例子,重构列表中+运算符, 变成只打印: Hello, Python.

# 先看看原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一样,添加新的成员,而只是输出字符串(这就是重构运算符方法)。

发布了58 篇原创文章 · 获赞 100 · 访问量 40万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章