#运算符重载就是让用类写成的对象,可截获并响应用在内置类型上的运算:加法,切片,打印和点号运算等
#1. 以双下划线命名的方法(__X__)的特殊钩子,python运算符重载的实现是提供特殊命名的方法来拦截运算,python替每种运算和特殊命名的方法之间,定义了固定不变的映射关系
#2. 当实例出现在内置运算时,这类方法会自动调用,例如,如果实例对象继承了__add__方法,当对象出现+表达式内时,该方法就会调用,该方法的返回值会编程相应表达式的结果
#3. 类可覆盖多数内置类型运算
#4. 运算符覆盖方法没有默认值,而且也不需要,如果类没有定义或者继承运算符重载方法,就是说相应的运算在类实例中不支持,例如:如果没有__add__,+表达式就会引发异常
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]
#1. 以双下划线命名的方法(__X__)的特殊钩子,python运算符重载的实现是提供特殊命名的方法来拦截运算,python替每种运算和特殊命名的方法之间,定义了固定不变的映射关系
#2. 当实例出现在内置运算时,这类方法会自动调用,例如,如果实例对象继承了__add__方法,当对象出现+表达式内时,该方法就会调用,该方法的返回值会编程相应表达式的结果
#3. 类可覆盖多数内置类型运算
#4. 运算符覆盖方法没有默认值,而且也不需要,如果类没有定义或者继承运算符重载方法,就是说相应的运算在类实例中不支持,例如:如果没有__add__,+表达式就会引发异常
#5. 运算符可让类与python的对象模型相集成,重载类型运算时,以类实现的用户定义对象的行为就会像内置对象一样,因此,提供了一致性,以及与预期接口的兼容性
#运算符重载只意味着在类方法中拦截内置的操作——当类的实例出现在内置操作中,python自动调用你的方法,并且你的方法的返回值变成了相关操作的结果
#运算符重载让类拦截常规的python运算符
#类可重载所有python表达式运算符
#类可重载打印,函数调用,属性点号运算等内置运算
#重载使类实例的行为像内置类型
#重载是通过提供特殊名称的类方法来实现的
#所有重载方法的名称前后都有两个下划线字符
#多数重载方法只用在需要对象行为表现的像内置类型一样的高级程序中
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]