一、什麼是繼承? 繼承是一種新建類的的方式,在python中支持一個子類繼承多個父類。新建的類稱爲子類或者派生類,父類又能夠稱爲基類或者超類,子類會」遺傳「父類的屬性。python
二、爲何要用繼承 減小代碼冗餘ui
class ParentClass1: pass class ParentClass2: pass class Subclass1(ParentClass1): pass class Subclass2(ParentClass1,ParentClass2): pass print(Subclass1.__bases__) #(<class '__main__.ParentClass1'>,) print(Subclass2.__bases__) #(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
三、繼承是類與類之間的關係,尋找這種關係須要先抽象再繼承spa
class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyTeacher(OldboyPeople): #繼承OldboyPeople類 def change_score(self): print('teacher %s is changing score' %self.name) class Oldboystudent(OldboyPeople): #繼承OldboyPeople類 def choose(self): print('student %s choose course' %self.name) tea1 = OldboyTeacher('egon', 18, 'male') # 至關於OldboyTeacher.__init__(...) stu1=Oldboystudent('alex',73,'female') print(tea1.name,tea1.age,tea1.sex) #egon 18 male print(stu1.name,stu1.age,stu1.sex) #alex 73 female
派生:子類定義本身新的屬性,若是與父類同名,以子類本身的爲準code
class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def f1(self): print('爹的f1') class OldboyTeacher(OldboyPeople): def __init__(self,name,age,sex,level,salary): self.name=name self.age=age self.sex=sex self.level=level self.salary=salary def change_score(self): print('teacher %s is changing score' %self.name) def f1(self): print('兒子的f1') tea1 = OldboyTeacher('egon', 18, 'male',9,3.1) #傳入6個參數,若是傳入父類ze報錯 print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary) #egon 18 male 9 3.1
方式一:指名道姓地調用(與繼承沒有什麼關係)對象
class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyTeacher(OldboyPeople): #無關緊要 def __init__(self, name, age, sex, level, salary): # self.name = name # self.age = age # self.sex = sex OldboyPeople.__init__(self,name, age, sex)#用 OldboyPeople調用__init__的方式重用父類功能 self.level = level self.salary = salary tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1) print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #egon 18 male 9 3.1
方式二:super()調用(嚴格依賴於繼承)blog
super ( ) 的返回值是一個特殊的對象,該對象專門用來調用父類中的屬性,super()會嚴格按照mro列表從當前查找到的位置繼續日後查找繼承
瞭解:在python2中,須要super(本身的類名,self)it
class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex class OldboyTeacher(OldboyPeople): #必須有父類 def __init__(self, name, age, sex, level, salary): super(OldboyTeacher,self).__init__(name,age,sex)# OldboyPeople.__init__(self,name, age,sex) self.level = level self.salary = salary tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1) print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #egon 18 male 9 3.1
一、新式類: 繼承object的類,以及該類的子類,都是新式類class
在python3中,若是一個類沒有指定繼承的父類,默認就繼承object,因此說python3中全部的類都是新式類 object
二、經典類(只有在python2才區分經典類與新式類):沒有繼承object的類,以及該類的子類,都是經典類
class Foo(): #在python3中 pass class Bar(Foo): pass print(Foo.__bases__) #(<class 'object'>,) print(Bar.__bases__) #(<class '__main__.Foo'>,)
屬性查找
obj.x
1、先從obj.__dict__
2、對象的類.__dict__
3、父類.__dict__
..........
若是繼承關係爲非菱形結構,則會按照先找B這一條分支,而後再找C這一條分支,最後找D這一條分支的順序直到找到咱們想要的屬性
若是繼承關係爲菱形結構,那麼屬性的查找方式有兩種,分別是:深度優先和廣度優先
print(F.__mro__) # F.mro() #只有新式類纔有這個屬性能夠查看線性列表,查看屬性查找順序,經典類沒有這個屬性