day 17
今日內(nèi)容大綱
01昨日內(nèi)容回顧
02作業(yè)講解
03繼承
?
繼承
面向?qū)ο笕筇卣?#xff1a;繼承,封裝,多態(tài)
在OOP(Object Oriented Programming)程序設(shè)計中,當(dāng)我們定義一個class的時候,可以從某個現(xiàn)有的class?繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。
class Animal:def __init__(self,name,sex,age):self.name=nameself.sex=sexself.age=agedef eat(self):print('都會吃。。。')class Person(Animal):passp1=Person('alex','male',20)
p2=Animal('jinxing','male',18)
p1.eat() #子類以及子類實例化的對象可以訪問父類的任何方法和變量
print(p1.name) #結(jié)果是:alex
Person.eat(11) #類名可以訪問父類的所有內(nèi)容
繼承有什么好處?最大的好處是子類獲得了父類的全部屬性及功能。上述例子中Person繼承了Animal,則Person中就可以直接使用Animal中的eat方法
在實例化一個Person的時候,子類繼承了父類的構(gòu)造函數(shù),就需要提供父類三個屬性變量name,sex和age
繼承還可以一級一級的繼承
?
問題來了:子類中有一個eat方法,父類中也有一個eat方法,那么在實例化對象之后調(diào)用eat方法到底是子類中的還是父類中的呢?我想既要執(zhí)行子類的方法,又要執(zhí)行父類的方法,該怎么做?
上節(jié)課講的查詢順序我們可以知道,實例化一個Person對象的時候,用那個實例化出來的對象通過.來調(diào)用時,會先從子類中查找eat方法,子類中沒有再從父類查找
代碼如下:
class Animal:def __init__(self,name,sex,age):self.name=nameself.sex=sexself.age=agedef eat(self):print('都會吃。。。')class Person(Animal):def eat(self):#1.Animal.eat(self)#2.super().eat()print('人吃東西...')p1 = Person('jiang','male',20) p1.eat()有兩種方法可以解決,第一種是在子類的eat方法中添加Animal.eat(self).這時就會先調(diào)用父類的eat方法
第二種是在子類的eat方法中添加super().eat()。功能一樣但是一般用這種方法
?
問題二:動物有些屬是特有的,該如何添加這些特有的屬性?
代碼如下:
class Animal:def __init__(self,name,sex,age):self.name=nameself.sex=sexself.age=agedef eat(self):print('都能吃')def drink(self):print('都能喝') class Dog(Animal):def hit(self):print('狗會咬人')class Bird(Animal):def __init__(self,name,sex,age,wing):#self接收的是b1對象#Animal.__init__(self,name,sex,age) #一般不用這種方法super(Bird,self).__init__(name,sex,age)#super().__init__(name,sex,age)self.wing=wingdef miao(self):print('嗷嗷叫')def eat(self):#super().eat()#Animal.eat(self)print('%s會吃...'%self.name)#既要執(zhí)行子類的方法,又要執(zhí)行父類的方法#1.#Animal.__init__(self,name,sex,age)#2.super().__init__(name,sex,age) b1 = Bird('鸚鵡','公',10,'綠翅膀') 繼承的進(jìn)階: #類:經(jīng)典類,新式類#新式類:凡是繼承object類都是新式類
#python3中,所有的類都是新式類
#因為python3中的類都默認(rèn)繼承object
#經(jīng)典類:不繼承object類都是經(jīng)典類(python3中不存在)
#python2中既有新式類,又有經(jīng)典類,所有的類默認(rèn)都不繼承object,所有的類默認(rèn)都是經(jīng)典類
#單繼承:新式類,經(jīng)典類查詢順序一樣
#多繼承:
#新式類:遵循廣度優(yōu)先
#經(jīng)典類:遵循深度優(yōu)先 #多繼承的新式類 廣度優(yōu)先class A:def func(self):print('IN A') class B(A):pass#def func(self):#print('IN B') class C(A):pass#def func(self):#print('IN C') class D(B):pass#def func(self):#print('IN D') class E(C):#passdef func(self):print('IN E') class F(D,E,C):passf1 = F() f1.func() print(F.mro()) #可以查詢類的繼承順序
廣度優(yōu)先:F->D->B->E->C->A #多繼承的經(jīng)典類 深度優(yōu)先:一條路走到底
?
轉(zhuǎn)載于:https://www.cnblogs.com/hongweijiang/p/10862676.html
總結(jié)
- 上一篇: python 基础 -- pyth
- 下一篇: leetcode 392