day24 面向對象-繼承
阿新 • • 發佈:2017-09-18
back 結構 teacher opened font pla __main__ style 技術分享
什麽是繼承
繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類
繼承是類中提供的一種新語法
面向對象三大特性:封裝 繼承 多態
繼承:什麽是什麽的關系
他大舅打二舅都是他舅
高桌子低板凳都是木頭
繼承語法,單繼承和多繼承
class ParentClass1: #定義父類
pass
class ParentClass2: #定義父類
pass
class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
pass
class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類
pass
查看繼承__bases__
類名.__bases__
>>> SubClass1.__bases__ #__base__只查看從左到右繼承的第一個子類,__bases__則是查看所有繼承的父類
(<class ‘__main__.ParentClass1‘>,)
>>> SubClass2.__bases__
(<class ‘__main__.ParentClass1 ‘>, <class ‘__main__.ParentClass2‘>)
提示:如果沒有指定基類,python的類會默認繼承object類,object是所有python類的基類,它提供了一些常見方法(如__str__)的實現。
繼承與抽象(先抽象,再繼承)
抽象即抽取類似或者說比較像的部分。
抽象分成兩個層次:
1.將奧巴馬和梅西這倆對象比較像的部分抽取成類;
2.將人,豬,狗這三個類比較像的部分抽取成父類。
抽象最主要的作用是劃分類別(可以隔離關註點,降低復雜度)
繼承:是基於抽象的結果,通過編程語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。
抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類
繼承與重用性
#狗 class Dog: def eat(self): print(‘eating‘) def drink(self): print(‘drinking‘) def sleep(self): print(‘sleeping‘) def say(self): print(‘汪汪汪‘) #貓 class Cat: def eat(self): print(‘eating‘) def drink(self): print(‘drinking‘) def sleep(self): print(‘sleeping‘) def say(self): print(‘喵喵喵‘) #狗類和貓類都有 eat,drink,sleep 的方法,所有寫一個父類,讓子類繼承父類的這些方法 class Animal: #父類、超類 def eat(self): pass def drink(self): pass def sleep(self): pass class Dog(Animal): #子類、派生類 子類繼承父類的方法和屬性 pass class Cat(Animal): #子類、派生類 pass dog = Dog() cat = Cat() dog.eat() dog.drink() dog.say() #汪汪汪 cat.eat() cat.drink() cat.say() #喵喵喵 print(Dog.__bases__)使用繼承來解決代碼重用的例子
在開發程序的過程中,如果我們定義了一個類A,然後又想新建立另外一個類B,但是類B的大部分內容與類A的相同時
我們不可能從頭開始寫一個類B,這就用到了類的繼承的概念。
通過繼承的方式新建類B,讓B繼承A,B會‘遺傳’A的所有屬性(數據屬性和函數屬性),實現代碼重用
class Animal:
‘‘‘
人和狗都是動物,所以創造一個Animal基類
‘‘‘
def __init__(self, name, aggressivity, life_value):
self.name = name # 人和狗都有自己的昵稱;
self.aggressivity = aggressivity # 人和狗都有自己的攻擊力;
self.life_value = life_value # 人和狗都有自己的生命值;
def eat(self):
print(‘%s is eating‘%self.name)
class Dog(Animal):
pass
class Person(Animal):
pass
egg = Person(‘egon‘,10,1000)
ha2 = Dog(‘二楞子‘,50,1000)
egg.eat()
ha2.eat()
派生
子類也可以添加自己新的屬性或者在自己這裏重新定義這些屬性(不會影響到父類),需要註意的是,一旦重新定義了自己的屬性且與父類重名,那麽調用新增的屬性時,就以自己為準了。
在繼承中
子類可以繼承父類的所有屬性和方法
但是 當父類和子類中有同名方法的時候 一定調用子類的
如果想使用父類該方法的功能 需要借助super方法
super
子類中執行父類的方法super()
class A:
def hahaha(self):
print(‘A‘)
class B(A):
def hahaha(self):
super().hahaha() #調用父類中的hahaha()方法
#super(B,self).hahaha()
#A.hahaha(self)
print(‘B‘)
a = A()
b = B()
b.hahaha() #A B
super(B,b).hahaha() #A
實例一
class Animal: def __init__(self,name,food): self.name = name self.food = food def eat(self): print(‘%s吃%s‘%(self.name,self.food)) def drink(self): print(‘%s喝水‘%self.name) class Dog(Animal): def __init__(self,name): #子類對象初始化 實例化時只接受一個參數 super().__init__(name,‘狗糧‘) #調用父類的__init__方法,需要傳入兩個參數 狗類的food就是狗糧 def swim(self): print(‘在遊泳‘) class Bird(Animal): def __init__(self,name): super().__init__(name,‘蟲子‘) def fiy(self): print(‘%s在飛‘%self.name) gou = Dog(‘旺財‘) gou.eat() gou.drink() niao = Bird(‘布谷鳥‘) niao.fiy() niao.eat() niao.drink()View Code
實例二
class Animal: #定義父類 def __init__(self,name,blood,aggr): self.name =name self.blood = blood self.aggr = aggr class Person(Animal): #繼承父類Animal def __init__(self,name,blood,aggr,money): #實例化一個人類時,要傳入4個參數 super().__init__(name,blood,aggr) #共有的屬性調用父類的__init__方法,傳入父類__init__要傳的參數 self.money = money #子類獨有的屬性 def attack(self,dog): dog.blood -= self.aggr class Dog(Animal): #繼承父類Animal def bite(self,person): person.blood -= self.aggr alex = Person(‘alex‘,2000,100,100000) print(alex.money) #100000View Code
通過繼承建立了派生類與基類之間的關系,它是一種‘是‘的關系,比如白馬是馬,人是動物。
當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如教授是老師
>>> class Teacher:
... def __init__(self,name,gender):
... self.name=name
... self.gender=gender
... def teach(self):
... print(‘teaching‘)
...
>>>
>>> class Professor(Teacher):
... pass
...
>>> p1=Professor(‘egon‘,‘male‘)
>>> p1.teach()
teaching
day24 面向對象-繼承