當我們調用 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__方法中,重寫父類的屬性,那再調用的時候,還是優先調用子類本身的值。