類的繼承和多態
阿新 • • 發佈:2018-04-12
ldb pri 我們 3.1 b- 方式 bar per 依賴
繼承
1、什麽是繼承?
繼承是一種新建類的方式
新建的類稱之為類或者派生類,
父類又可以稱之為基類或者超類
子類會‘遺傳’父類的屬性
繼承是類與類之間的關系,尋找這種關系需要先抽象再繼承
2、為什麽要用繼承
減少代碼冗余
3、怎麽用繼承
class parentclass1:
pass
class parentclass2:
pass
class subclass1(parentclass1):
pass
class subclass2(parentclass1,parentclass2):#這就是繼承上面
pass
print(subclass2.__bases__)#這個bases就是查看有幾個‘爹’的
那我們能從“爹”那裏能繼承什麽呢?
class parent1:
school=‘oldboy’
def __init__(self, name,age,sex):
self.name=name
self.age=age
self.sex=sex
class parent2:
school=‘oldboy‘
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
class son1(parent1):
def f1(self):
print(‘%s son1‘%self.name)
class son2(parent1,parent2):
def f2(self):
print(‘%s son2‘%self.name)
猜一猜 f2中的f1,調用的到底是哪裏的?是自己的還是兒子的
調用的是兒子輩的。不是根據就近原則找自己的而是找兒子的
class foo(): #爹 def f1(self): print(‘fool.f1‘) def f2(self): print(‘foo.f2‘) self.f1() class bar(foo): #兒子 def f1(self): print(‘bar.f1‘)
派生:子類定義自己新的屬性,如果與父輩同名,以子類自己為準
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 change_score(self): # print(‘teacher %s is changing score‘ %self.name) # # def f1(self): # print(‘兒子的f1‘) # # tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘) # tea1.f1(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) print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary)
子類派生出的新方法中重用父輩的功能:
方法一:指名道姓地調用(其實與繼承沒有什麽關系的)
OldboyPeople.__init__(self,name, age, sex) # class OldboyPeople: # school = ‘oldboy‘ # # def __init__(self, name, age, sex): # self.name = name # self.age = age # self.sex = sex # # def tell_info(self): # print(""" # ===========個人信息========== # 姓名:%s # 年齡:%s # 性別:%s # """ %(self.name,self.age,self.sex)) # # # class OldboyTeacher(OldboyPeople): # # tea1,‘egon‘, 18, ‘male‘, 9, 3.1 # def __init__(self, name, age, sex, level, salary): # # self.name = name # # self.age = age # # self.sex = sex # OldboyPeople.__init__(self,name, age, sex)#指名道姓的應用 # # self.level = level # self.salary = salary # # def tell_info(self): # OldboyPeople.tell_info(self) # print(""" # 等級:%s # 薪資:%s # """ %(self.level,self.salary)) # # tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘, 9, 3.1) # # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) # # # tea1.tell_info()
方法二:super()調用(嚴格依賴於繼承)
super()的返回值是一個特殊的對象,該對象專門用來調用父類中的屬性
#了解再python2中,需要super(自己的類名,self)
class OldboyPeople: school = ‘oldboy‘ def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def tell_info(self): print(""" ===========個人信息========== 姓名:%s 年齡:%s 性別:%s """ %(self.name,self.age,self.sex)) class OldboyTeacher(OldboyPeople): # tea1,‘egon‘, 18, ‘male‘, 9, 3.1 def __init__(self, name, age, sex, level, salary): # OldboyPeople.__init__(self,name, age, sex) super(OldboyTeacher,self).__init__(name,age,sex) self.level = level self.salary = salary def tell_info(self): # OldboyPeople.tell_info(self) super().tell_info() print(""" 等級:%s 薪資:%s """ %(self.level,self.salary)) tea1 = OldboyTeacher(‘egon‘, 18, ‘male‘, 9, 3.1) # print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) tea1.tell_info()
二、經典類與新式類
1、新式類:
繼承object的類,以及該類的子類,都是新式類,在python3中,如果一個類沒有指定繼承父輩,默認就繼承object
所以說python3中所有的類都是新式類
2、經典類:
沒有繼承object的類,以及該類的子類,都是經典類
三、在棱形繼承背景下,super嚴格按照查找屬性
1、經典類:深度優先
先f--》d--》b--》a 找到了就不找了。一條道路走到黑
2、新式類:廣度優先
先f--》d--》b--》e--》c--》a 按照菱形找
class A: # def test(self): # print(‘from A‘) pass class B(A): # def test(self): # print(‘from B‘) pass class C(A): # def test(self): # print(‘from C‘) pass class D(B): # def test(self): # print(‘from D‘) pass class E(C): # def test(self): # print(‘from E‘) pass class F(D,E): # def test(self): # print(‘from F‘) pass # f1=F() # f1.test() # F->D->B->E->C-A->object print(F.mro())
類的繼承和多態