【Python043-魔法方法:算术方法2】

一、 反运算符

当对应的操作数不支持调用时,反运算数被调用(参考资料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),然后从左的子类开始查找,知道查到到最上层,无法查找为止

猜你喜欢

转载自www.cnblogs.com/frankruby/p/9833978.html