天天看点

论super().__init__()的用法

  当我们调用 super() 的时候,实际上是实例化了一个 super 类。 super 是个类,既不是关键字也不是函数等其他数据结构,该对象就是专门用来访问父类中的属性的(严格按照继承的关系)。

--用法解析:

  在子类的__init__方法中使用 super().__init__() , 就相当于把父类的 __init__构造方法拿过来用, 并且可以对父类的__init__方法进行补充(比如添加成员属性/方法) ,也就相当于把父类的__init__方法继承过来了, 之后用子类实例化一个对象后, 这个对象可以点出父类对象的成员属性/方法, 当然也可以点出自己类对象的成员属性/方法。因为子类继承父类时,子类中的__init__方法会覆盖掉父类的__init__方法, 导致无法通过实例化子类的类对象去给父类的类对象添加成员属性/方法,也无法调用父类类对象的属性/方法。

class Grade:
    def __init__(self, className):
        self.className = className
    def info(self):
        return "这是一个快班"

class Student(Grade):
    def __init__(self, className, number, name, age, score):
        # super().__init__(className)
        self.number = number
        self.name = name
        self.age = age
        self.score = score

    def show_all(self):
        return "{}年级的学号为{}的学生姓名是{},年龄为{},分数是{}".format(self.className,
                                                     self.number, self.name, self.age, self.score)
    
zhansan = Student("六", "张三", "18", "1","99")
print(zhansan.info())
print(zhansan.className)      

  测试结果如下,从执行结果可以看出,子类Student虽然继承父类Grade,只能使用父类的方法,无法使用父类的属性,原因上述已经说过,因为子类的构造函数会覆盖掉父类的init函数。

"C:\Program Files\Python37\python.exe" D:/demo.py
这是一个快班 
Traceback (most recent call last): 
  File "D:/AutoAndroidAPPDY/demo.py", line 110, in <module> 
    print(zhansan.className) 
AttributeError: 'Student' object has no attribute 'className'      

测试二,看下增加super().__init__(className)后的结果:

class Grade:
    def __init__(self, className):
        self.className = className
    def info(self):
        return "这是一个快班"

class Student(Grade):
    def __init__(self, className, number, name, age, score):
        super().__init__(className)
        self.number = number
        self.name = name
        self.age = age
        self.score = score

    def show_all(self):
        return "{}年级的学号为{}的学生姓名是{},年龄为{},分数是{}".format(self.className,
                                                     self.number, self.name, self.age, self.score)
    
zhansan = Student("六", "张三", "18", "1","99")
print(zhansan.info())
print(zhansan.className)
print(zhansan.show_all())      

执行结果:

"C:\Program Files\Python37\python.exe" D:/demo.py      
这是一个快班 
六 
六年级的学号为张三的学生姓名是18,年龄为1,分数是99      

  此时Student已经成功继承了父类Grade的__init__,所以super().__init__()的作用也就显而易见了,就是执行父类的构造函数,使得我们能够调用父类的属性。

注:如果子类的__init__方法中,重写父类的属性,那再调用的时候,还是优先调用子类本身的值。