#运算符重载就是让用类写成的对象,可截获并响应用在内置类型上的运算:加法,切片,打印和点号运算等
#1. 以双下划线命名的方法(__X__)的特殊钩子,python运算符重载的实现是提供特殊命名的方法来拦截运算,python替每种运算和特殊命名的方法之间,定义了固定不变的映射关系
#2. 当实例出现在内置运算时,这类方法会自动调用,例如,如果实例对象继承了__add__方法,当对象出现+表达式内时,该方法就会调用,该方法的返回值会编程相应表达式的结果
#3. 类可覆盖多数内置类型运算
#4. 运算符覆盖方法没有默认值,而且也不需要,如果类没有定义或者继承运算符重载方法,就是说相应的运算在类实例中不支持,例如:如果没有__add__,+表达式就会引发异常
#5. 运算符可让类与python的对象模型相集成,重载类型运算时,以类实现的用户定义对象的行为就会像内置对象一样,因此,提供了一致性,以及与预期接口的兼容性
class FirstClass:
def setdata(self, value):
self.data=value
def display(self):
print(self.data)
class SecondClass(FirstClass):
def display(self): #重写display方法
print('current value="%s"'%self.data)
class ThirdClass(SecondClass):
def __init__(self,value):
self.data=value
def __add__(self, other): #重载加法
return ThirdClass(self.data+other)
def __str__(self): #print打印一个对象时,运行__str__
return '[ThirdClass:%s]'%self.data
def mul(self,other):
self.data*=other
a=ThirdClass('abc')
a.display() #current value="abc"
print(a) #[ThirdClass:abc] 调用__str__
a=a+'xyz'
a.display() #current value="abcxyz"
print(a) #[ThirdClass:abcxyz]
a.mul(3)
a.display() #current value="abcxyzabcxyzabcxyz"
print(a) #[ThirdClass:abcxyzabcxyzabcxyz]