python super()函数

一、什么是super()函数

super()函数是用来调用父类(超类)的一个方法。

super()可以用来解决多重继承问题。

二、super()用法

python2版本中super的用法是这样的:super(Class,self).方法,这个Class是调用super()方法的类的名称。

python3版本中super的用法是这样的:super().方法

三、super()单继承

class A():
    def __init__(self,name):
        self.name=name
        print(self.name)
class B(A):
    def __init__(self,name):
        super().__init__(name)
mm='xx'
b=B(mm)

可以看到,B继承了A的初始化方法。

四、继承

继承可以让子类拥有父类的属性和方法,不用重复写相同的代码,并且子类在继承父类的基础上还可以增加新的属性和方法。子类还可以重写父类的方法,从而获取与父类不同的功能,实现多态。

在python中所有的类都是存在继承关系的,没有显示继承的,都是默认继承object类

五、super()多继承

class Person(object):
    def __init__(self, name):
        self.__name = name
        print("Person init")

    def get_name(self):
        return self.__name


class Monther(Person):
    def __init__(self, name, job):
        Person.__init__(self, name)
        self.__job = job
        print("Monther init")

    def get_job(self):
        return self.__job


class Parent(Person):
    def __init__(self, name, age):
        Person.__init__(self, name)
        self.__age = age
        print("Parent init")

    def get_age(self):
        return self.__age


class Son(Parent, Monther):
    def __init__(self, name, age, job, gender):
        Parent.__init__(self, name, age)
        Monther.__init__(self, name, job)

        self.__gender = gender
        print("Son init")

    def get_gender(self):
        return self.__gender


wo = Son('tom', 22, 'teacher', 'male')
print(wo.get_name(), wo.get_age(), wo.get_job(), wo.get_gender())

>>>Person init
Parent init
Person init
Monther init
Son init
tom 22 teacher male

很明显这是不对的,因为 Father 类和 Mother 类都是继承于 Person 类的,在自己的初始化方法中,执行了父类的初始化方法,所以执行了两次,造成了代码冗余
多重多继承 =》 person被调用多次 ==> object更多次

super能解决在继承中父类被重复初始化的问题

super函数的格式

super(CurrentClassName, self).init(*args, **kwargs)

class Person(object):
    def __init__(self, name):
        self.__name = name
        print("Person init")

    def get_name(self):
        return self.__name


class Mother(Person):
    def __init__(self, job, *args):
        super(Mother, self).__init__(*args)
        self.__job = job
        print("Mother init")

    def get_job(self):
        return self.__job


class Father(Person):
    def __init__(self, age, *args):
        super(Father, self).__init__(*args)
        self.__age = age
        print("Father init")

    def get_age(self):
        return self.__age


class Son(Father, Mother):
    def __init__(self, name, age, job, gender):
        super(Son, self).__init__(name, age, job)
        self.__gender = gender
        print("Son init")

    def get_gender(self):
        return self.__gender


wo = Son('tom', 22, 'teacher', 'male')
print(wo.get_name(), wo.get_age(), wo.get_job(), wo.get_gender())

>>>Person init
Mother init
Father init
Son init
teacher tom 22 male

通过执行结果来看,使用 super 改进后的代码只初始化了一次 Person 的初始化方法。

六、mro
mro Method Resolution Order 方法解析顺序

在类出现继承时,每个类中都会保存一个当前类的继承关系的表。

super 函数在执行时,会在自己保存的这个继承关系中去查找第一个参数,也就是当前的类名的下一个类是谁。然后去调用下个类的初始化方法。

Python 中使用广度优先算法来决定继承关系的排序

这里写图片描述


Mro顺序
print(Son.__mro__)

>>>(<class '__main__.Son'>, <class '__main__.Father'>, <class '__main__.Mother'>, <class '__main__.Person'>, <class 'object'>)

在初始化父类时,也可以使用 super().init() 函数来调用,简化super函数的写法。

这时,super函数中没有参数,还是能正确执行,就是依照 mro 中的顺序来执行的。

super().__init__(*args)

对象在调用方法时,也会依照这个顺序来查找方法。

类在继承时,继承关系的书写顺序会影响 mro 中的顺序。
 

 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值