您的位置:首页 > 其它

论super().__init__()的用法

2021-01-25 20:00 10 查看
  当我们调用 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__方法中,重写父类的属性,那再调用的时候,还是优先调用子类本身的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: