运算符重载

运算符重载
  运算符重载本质上就是重新定义运算符的功能。
  通过运算符重载,可以使得自定义类的实例能够使用运算符完成相应的功能。
  Python中,每个运算符都有其对应的方法,通过重新定义这些方法,就可以实现运算符重载。

减法运算符-
  减法运算符-对应的方法是__sub__(),通过重新定义方法__sub__()就可以实现减法运算符-的重载。
  下面的例子展示了减法运算符-的重载:
# -*- coding: utf-8 -*-

class Number:
    def __init__(self, origin):
        self.data = origin
        
    def __sub__(self, other):
        return Number(self.data - other.data)
        
n1 = Number(5)
n2 = Number(3)
n = n1 - n2
print('n1.data:', n1.data)
print('n2.data:', n2.data)
print(' n.data:', n.data)

  程序执行的输出为:

n1.data: 5
n2.data: 3
n.data: 2


加法运算符+

  加法运算符+对应的方法是__add__(),通过重新定义方法__add__()就可以实现加法运算符+的重载。
  下面的例子展示了加法运算符+的重载:
# -*- coding: utf-8 -*-

class Number:
    def __init__(self, origin):
        self.data = origin
        
    def __add__(self, other):
        return Number(self.data + other.data)
        
n1 = Number(5)
n2 = Number(3)
n = n1 + n2
print('n1.data:', n1.data)
print('n2.data:', n2.data)
print(' n.data:', n.data)

  程序执行的输出为:

n1.data: 5
n2.data: 3
n.data: 8


运算符方法

  在Python中有很多运算符对应的特殊方法。下面是常用的运算符方法:

methodoverloadcall
__init__构造方法对象创建: X = Class(args)
__del__析构方法X对象收回
__add__云算法+如果没有_iadd_, X+Y, X+=Y
__or__运算符|如果没有_ior_,X|Y, X|=Y
_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        
注释:(lt: less than, gt: greater than,        
  le: less equal, ge: greater equal,        
  eq: equal, ne: not equal        
__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__之前创建对象