day 17
今日內容大綱
01昨日內容回顧
02作業講解
03繼承
?
繼承
面向對象三大特征:繼承,封裝,多態
在OOP(Object Oriented Programming)程序設計中,當我們定義一個class的時候,可以從某個現有的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) #結果是:alex
Person.eat(11) #類名可以訪問父類的所有內容
繼承有什么好處?最大的好處是子類獲得了父類的全部屬性及功能。上述例子中Person繼承了Animal,則Person中就可以直接使用Animal中的eat方法
在實例化一個Person的時候,子類繼承了父類的構造函數,就需要提供父類三個屬性變量name,sex和age
繼承還可以一級一級的繼承
?
問題來了:子類中有一個eat方法,父類中也有一個eat方法,那么在實例化對象之后調用eat方法到底是子類中的還是父類中的呢?我想既要執行子類的方法,又要執行父類的方法,該怎么做?
上節課講的查詢順序我們可以知道,實例化一個Person對象的時候,用那個實例化出來的對象通過.來調用時,會先從子類中查找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).這時就會先調用父類的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)#既要執行子類的方法,又要執行父類的方法#1.#Animal.__init__(self,name,sex,age)#2.super().__init__(name,sex,age) b1 = Bird('鸚鵡','公',10,'綠翅膀') 繼承的進階: #類:經典類,新式類#新式類:凡是繼承object類都是新式類
#python3中,所有的類都是新式類
#因為python3中的類都默認繼承object
#經典類:不繼承object類都是經典類(python3中不存在)
#python2中既有新式類,又有經典類,所有的類默認都不繼承object,所有的類默認都是經典類
#單繼承:新式類,經典類查詢順序一樣
#多繼承:
#新式類:遵循廣度優先
#經典類:遵循深度優先 #多繼承的新式類 廣度優先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()) #可以查詢類的繼承順序
廣度優先:F->D->B->E->C->A #多繼承的經典類 深度優先:一條路走到底
?
轉載于:https://www.cnblogs.com/hongweijiang/p/10862676.html
總結
- 上一篇: python 基础 -- pyth
- 下一篇: leetcode 392