Python super()函数


作用

python内置的super()函数返回一个代理对象(父类的临时对象),以便我们能够访问父类的方法。

super()一般以super().__init__()的形式出现。

supper()的两个主要使用场景是:

  • 可以让我们避免直接使用父类的名字
  • 处理多继承

supper()与单继承

在单继承的场景下,我们可以通过supper()来引用父类。

我们以狗子举例,狗有不同的品种,如金毛、哈士奇等,它们都是狗,所以这里

  • 创建一个底层的狗(Dog)类
  • 再创建一个金毛类,金毛类继承狗类

#狗类
class Dog: 
    def __init__(self, dogName):
        print(dogName, '是狗的一个品种')

#金毛类
class GoldenRetriever(Dog):
    def __init__(self):
        print('金毛的毛一般是金色的')
        super().__init__('金毛') # 引用父类Dog,‘金毛’传给了dogName

# 创建一个金毛实例
dog1 = GoldenRetriever() 

输出:


金毛的毛一般是金色的
金毛 是狗的一个品种

可以看到,输出结果表明我们使用了父类的方法。即super().__init__('金毛')虽然没有直接使用Dog这个父类的名称,但是它起到了引用Dog父类的作用。

可以理解为super()=Dogsuper().__init__('金毛')Dog.__init__('金毛'),所以这里的__init()__是指父类Dog的方法,而不是GoldenRetriever的。


Supper()与多继承

在上面单继承的基础上,我们还可以增加层级,进行多继承。

比如,金毛是狗、是哺乳动物、是动物,…


class Animal:
    def __init__(self, annimalName):
        print(annimalName, "是一种动物")


class Mammal(Animal):
    def __init__(self, mammalName):
        print(mammalName, "是一种哺乳动物")
        super().__init__(mammalName)


class Dog(Mammal):
    def __init__(self, dogName):
        print(dogName, '是狗的一个品种')
        super().__init__(dogName)


class GoldenRetriever(Dog):
    def __init__(self):
        print('金毛的毛一般是金色的')
        super().__init__('金毛')


dog1 = GoldenRetriever()

输出:


金毛的毛一般是金色的
金毛 是狗的一个品种
金毛 是一种哺乳动物
金毛 是一种动物