23 运算符重载
23.1 定义
用自定义的规则实现实例之间的运算符操作或函数操作
23.2 作用:
让实例象数学表达式一样进行运算操作
让实例象内建对象一样进行内建函数操作
让程序简洁易读
23.3 对象转字符串函数重载
repr(obj) 给机器看的字符串
两个函数用于返回对象的字符串
repr(obj)返回一个能代表此对象的表达式字符串,通常:eval(repr(obj)) ==obj
str(obj) 返回一个字符串 给人看的字符串
>>>s = ‘I am a progrem’
>>>eval(repr(s)) == s
True
23.3.1 对象转字符串函数重载方法:
repr() 函数的重载方法:
def __repr__(self):
······
str() 函数的重载方法:
def __str__(self):
·····
注:如果对象没有__str__方法,则用repr(obj)函数的结果代替
示例1 class MyNumber: '''此类用于定义一个整型数字类,用于演示str函数重载''' def __init__(self, value): self.value = value n1 = MyNumber(100) n2 = MyNumber(200) print(repr(n1)) print(str(n2)) 执行结果: <__main__.MyNumber object at 0x7fca98594a58> <__main__.MyNumber object at 0x7fca98594a90> 示例2 class MyNumber: '''此类用于定义一个整型数字类,用于演示str函数重载''' def __init__(self, value): self.value = value
def __repr__(self): return 'MyNumber('+repr(self.value)+')' #访问实例的属性
n2 = MyNumber(200) print(repr(n1)) print(str(n2)) 执行结果 MyNumber(100) MyNumber(200) 示例3 class MyNumber: '''此类用于定义一个整型数字类,用于演示str函数重载''' def __init__(self, value): self.value = value def __repr__(self): return 'MyNumber('+repr(self.value)+')' #访问实例的属性 def __str__(self): return '整型数值('+str(self.value)+')' n1 = MyNumber(100) n2 = MyNumber(200) print(repr(n1)) print(str(n2)) print(n2)
MyNumber(100) 整型数值(200) 整型数值(200) 示例4 如果将示例3的程序导入到交互模式下,将会有如下结果 >>> n1 = mynumber.MyNumber(100) >>> n1 MyNumber(100)
>>> print(n2) 整型数值(200) |
24 算术运算符的重载
+, __add__
-, __sub__
*, __mul__
/, __truediv__
//,__floordiv__
%,__mod__
** __pow__
24.1 二元运算符重载的格式
def __xxx__(slef,other):
·······
注:二元运算符的重载方法的参数列表中只能有两个参数
24.2 重载说明:
运算符重载方法的参数已经有固定的含义,不可改变原有意义
除__call__方法外,其它重载方法的参数个数不可变
class MyNumber: '''此类用于定义一个整型数字类,用于演示str函数重载''' def __init__(self, value): self.value = value def __repr__(self): return 'MyNumber(' + repr(self.value) + ')' # 访问实例的属性 def __str__(self): return '整型数值('+str(self.value)+')' def __add__(self,other): n = self.value + other.value return MyNumber(n)
n1 = MyNumber(100) n2 = MyNumber(200) print(n1.__add__(n2)) #等同于下一行 print(n1 + n2) 执行结果: 300 300 示例2 class MyList: def __init__(self, vaule): '''传入参数可变时,必须用拷贝,这样拿到的数据才为此对象所有,否则只是两个变量绑定到一份数据, 改变原有数据时将改变对象属性的值,这是不允许的''' self.vaule = vaule.copy() def __add__(self, other): lst = self.vaule + other.vaule return MyList(lst) def __str__(self): return 'MyList(' + str(self.vaule) + ')' l1 = MyList([1, 2, 3]) l2 = MyList([4, 5, 6]) print(l1.__add__(l2)) # MyList([1, 2, 3, 4, 5, 6]) print(l2 + l1) print( MyList([1, 2, 3]) + MyList([4, 5, 6]) ) 执行结果 MyList([1, 2, 3, 4, 5, 6]) MyList([4, 5, 6, 1, 2, 3]) MyList([1, 2, 3, 4, 5, 6]) |
25 反向算术运算
#这是代码书写格式
+, __radd__(self,lhs) # lhs + self
-, __rsub__(self,lhs) # lhs - self
*, __rmul__(self,lhs) # lhs * self
/, __rtruediv__(self,lhs) # lhs / self
//, __rfloordiv__(self,lhs) # lhs // self
%, __rmod__(self,lhs) # lhs % self
** __rpow__(self,lhs) # lhs ** self