近期在寫python程序時意外發現了子類調用父類方法的一些細節問. 仔細學習做筆記如下:
子類的方法要顯示調用父類的方法,不調用系統不會默認調用(不同於java)
調用方法有3種, 如下面的程序中的標記的 12,13,14 三行(任何一種方法都可以)
a) persion.__init__(self, name, age)
b) super(student, self).__init__(name, age)
c) super().__init__(name, age)
a方法是傳統的調用方法, b是改進后的方法. 區別是: 當基類的名字有改變時, a方法子類的中的相應代碼也要改. b就不用改了, 所以b方法要好一些. 方便代碼的維護. c方法呢, 是python3.x以上版本用的. 我沒有測試, 應當是可以的
需要注意的是; 如果使用super調用父類方法, 則父類必須是新式類.
新式類:就是所有類都必須繼承的類,如果什么都不想繼承,就繼承到object類
經典類:沒有父類
比如下我下面的代碼3行如果沒有object字樣, 則13行會報錯: TypeError: must be type, not classobj
我寫的試驗程序:
1#!/usr/bin/evn python 2 3class persion(): 4 def __init__(self, name, age): 5 self.name = name 6 self.age = age 7 def talk(self): 8 print "i am a persion. name: %s, age: %s" %(self.name, self.age) 9 10class student(persion): 11 def __init__(self, name, age, school): 12 #persion.__init__(self, name, age) 13 super(student, self).__init__(name, age) 14 #super().__init__(name, age) 15 #以上3種方法都可以用. 提供第2行的. 第3行在python3.x版本支持 16 self.school = school 17 def talk(self): 18 print ('i am a student. name: %s, age: %s, school: %s' % (self.name, str(self.age), self.school)) 19 20if __name__ == "__main__": 21 aPer = persion("lin", 2) 22 aPer.talk() 23 aStu = student("lin", 3, "MIddleSchool") 24 aStu.talk()
結果:
i am a persion. name: lin, age: 2
i am a student. name: lin, age: 3, school: MIddleSchool
轉載自:https://blog.csdn.net/weixin_30013175/article/details/116168584