一、 反运算符
当对应的操作数不支持调用时,反运算数被调用(参考资料Lhttps://fishc.com.cn/thread-48793-1-1.html )
1、对象(a+b)相加,如果对象a有__add__方法,请问b对象__radd__方法会被调用吗?
不会被调用
>>> class Iinit(int): def __radd__(self,other): print('__radd__被调用!') return int.__sub__(self,other) >>> a = Iinit('5') >>> b = Iinit('3') >>> a+b 8 >>> 1+b __radd__被调用! 2 >>> #a+b时,调用了__add__,则你不会调用__radd__ #1+b时,由于没有找到__add__,则调用了__radd__ (何时调用__radd__方法:当a对象的__add__没有实现或者不支持相应操作时,b会自动调用__radd__方法
2、如何在继承中调用基类的方法
基类的方法:在程序中,继承描述的多个类之间的关系,如果一个类A中的方法和属性可以被复用,就可以通过继承传递到B类,A类就被称为父类也叫做基类,那么B类就被称为子类也叫派生类
#子类可以直接调用父类的属性和方法 class A: def __init__(self): self.study='学习打卡第一天!' def learn(self): print('为梦想奋斗!') class B(A): def catch(self): print('喝一壶老酒让我回回头!') b = B() b.learn() b.catch() print(b.study) 为梦想奋斗! 喝一壶老酒让我回回头! 学习打卡第一天! >>>
使用super这个BIF
class Base: def __init__(self): print(' this is function of Base!') class A(Base): def __init__(self): super().__init__() print('this is function of A') class B(Base): def __init__(self): super().__init__() print('this is function of B') class C(A,B): def __init__(self): super().__init__() print('this is function of C') c = C() 打印输出: this is function of Base1 this is function of B this is function of A this is function of C
为什么super()函数重写之后,Base()函数只调用了一次初始化函数
要理解为什么会这样,首先的看python针对每一个定义的类,都会计算出一个方法解析顺序(MRO)列表,MRO列表只是对所有的基类进行了简单的排序,具体如下:
>>> print(C.__mro__) (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>) >>> print(type(C.__mro__)) <class 'tuple'>
由上面打印的内容可以看出,MRO列表是以元组的形式存储的(tuple),然后从左的子类开始查找,知道查到到最上层,无法查找为止