python的运算符重载可以算是语言的一大特色了。相比c#,python进行运算符重载将会方便许多,只需要重写以__开头和结尾的特殊方法即可,下面看一个简单的例子:
# 迭代器
class Indexer(object):
value = 1
# 加法运算重载
def __add__(self, value):
return self.value + value
indexer = indexer()
print(indexer + 3)
打印结果为4,可以看出来对indexer对象使用+运算符执行的是我们定义在__add__ 中的逻辑。其它的运算符重载也遵照这一方法。
method | overload call |
---|---|
__init__ | 构造函数 对象创建: X = Class(args) |
__del__ | 析构函数 X对象收回 |
__add__ | 运算符+ 如果没有_iadd_, X+Y, X+=Y |
__or__ | 运算符 |
__repr__, __str__ | 打印,转换 print(X),repr(X),str(X) |
__call__ | 函数调用 X(*args, **kwargs) |
__getattr__ | 点号运算 X.undefined |
__setattr__ | 属性赋值语句 X.any=value |
__delattr__ | 属性删除 del X.any |
__getattribute__ | 属性获取 X.any |
__getitem__ | 索引运算 X[key],X[i:j] |
__setitem__ | 索引赋值语句 X[key],X[i:j]=sequence |
__delitem__ | 索引和分片删除 del X[key],del X[i:j] |
__len__ | 长度 len(X),如果没有__bool__,真值测试 |
__bool__ | 布尔测试 bool(X) |
__lt__, __gt__, __le__, __ge__, __eq__, __ne__ | 特定的比较 X |
__radd__ | 右侧加法 other+X |
__iadd__ | 实地(增强的)加法 X+=Y(or else add) |
__iter__, __next__ | 迭代环境 I=iter(X), next() |
__contains__ | 成员关系测试 item in X(任何可迭代) |
__index__ | 整数值 hex(X), bin(X), oct(X) |
__enter__, __exit__ | 环境管理器 with obj as var: |
__get__, __set__, __delete__ | 描述符属性 X.attr, X.attr=value, del X.attr |
__new__ | 创建 在__init__之前创建对象 |
paython3.0中迭代器需要实现的迭代方法变更为了__next__而不是2.X版本的next
# 迭代器
class MyIterator(object):
def __init__(self, wrapped):
self.wrapped = wrapped
self.offset = 0
def __next__(self):
# 如果超出迭代范围直接抛出异常
if self.offset >= len(self.wrapped):
raise StopIteration('stop')
item = self.wrapped[self.offset]
self.offset += 1
return item
class Indexer(object):
data = [1, 2, 3, 4, 5, 6, 7]
# 迭代器重载
def __iter__(self):
return MyIterator(self.data)
indexer = Indexer()
for x in indexer:
print(x)
测试
1
2
3
4
5
6
7
[Finished in 0.2s]