python运算符重载

入门

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__ 特定的比较 XY,X<=Y,X>=Y, X==Y,X!=Y
__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]

你可能感兴趣的:(python)