python 运算符重载

时间:2021-09-15 23:58:11
#运算符重载就是让用类写成的对象,可截获并响应用在内置类型上的运算:加法,切片,打印和点号运算等
#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]