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__ 中的逻辑。其它的运算符重载也遵照这一方法。


常见运算符重载方法

methodoverload 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<Y,X>Y,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]
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值