1. 程式人生 > >第二十四天 PYTHON學習

第二十四天 PYTHON學習

創建 奧巴馬 方式 調用函數 重要 遺傳 劃分 存在 結構

【今日學習】

一.初識繼承

1、什麽是繼承

繼承是一種創建新類的方式,新建的類可以繼承一個或多個父類(python支持多繼承),父類又可稱為基類或超類,新建的類稱為派生類或子類。

子類會“”遺傳”父類的屬性,從而解決代碼重用問題(比如練習7中Garen與Riven類有很多冗余的代碼)

2、為什麽要有繼承(繼承的好處)

因為有些類內的屬性存在相同的地方,為了避免重用代碼,需要讓一個類去具備另一個類的特征和技能。

讓一個類可以繼承另一個類所具有的屬性,這個繼承類不僅有自身屬性,而且還具有被繼承類的屬性。一個類不僅可以繼承一個類,而且還可以繼承多個類。

繼承一個叫單繼承,繼承多個叫多繼承。

3、如何區分誰應該繼承誰的問題

先抽象再定義類,然後再區分誰繼承誰的問題

站的高度不同,抽象出的類具備的特征與技能就不同,

抽象即抽取類似或者說比較像的部分。

抽象分成兩個層次:

1.將奧巴馬和梅西這倆對象比較像的部分抽取成類;

2.將人,豬,狗這三個類比較像的部分抽取成父類。

抽象最主要的作用是劃分類別(可以隔離關註點,降低復雜度)

技術分享圖片

繼承:是基於抽象的結果,通過編程語言去實現它,肯定是先經歷抽象這個過程,才能通過繼承的方式去表達出抽象的結構。

抽象只是分析和設計的過程中,一個動作或者說一種技巧,通過抽象可以得到類

技術分享圖片

4、繼承之後的屬性查找順序問題

class Foo:
def f1(self):
print(‘Foo.f1‘)

def f2(self):
print(‘Foo.f2‘)
self.f1()

class Bar(Foo):
def f1(self):
print(‘Foo.f1‘)


b=Bar()
b.f2()

這段代碼很好詮釋了,繼承之後的屬性查找問題,當對象b查找f2函數時,首先在自身類找有沒有這個屬性,如果自身類找不到這個屬性,再

往父輩那找,只要這個對象調用函數(技能), 那就優先去自身查找有沒有這個屬性。

二、派生

派生是對於繼承類講的,繼承類不可能完全與父類具有相同額屬性,還需要自身具備不一樣的屬性,這就是繼承類的派生。

當然子類也可以添加自己新的屬性或者在自己這裏重新定義這些屬性(不會影響到父類),需要註意的是,一旦重新定義了自己的屬性且與父類重名,那麽調用新增的屬性時,就以自己為準了。

三、組合與派生

>>> class Equip: #武器裝備類
... def fire(self):
... print(‘release Fire skill‘)
...
>>> class Riven: #英雄Riven的類,一個英雄需要有裝備,因而需要組合Equip類
... camp=‘Noxus‘
... def __init__(self,nickname):
... self.nickname=nickname
... self.equip=Equip() #用Equip類產生一個裝備,賦值給實例的equip屬性
...
>>> r1=Riven(‘銳雯雯‘)
>>> r1.equip.fire() #可以使用組合的類產生的對象所持有的方法
release Fire skill

四、組合與繼承的區別

組合與繼承都是有效地利用已有類的資源的重要方式。但是二者的概念和使用場景皆不同,

1.繼承的方式

通過繼承建立了派生類與基類之間的關系,它是一種‘是‘的關系,比如白馬是馬,人是動物。

當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如老師是人,學生是人

2.組合的方式

用組合的方式建立了類與組合的類之間的關系,它是一種‘有’的關系,比如教授有生日,教授教python和linux課程,教授有學生s1、s2、s3...

組合與繼承都是有效地利用已有類的資源的重要方式。但是二者的概念和使用場景皆不同,

1.繼承的方式

通過繼承建立了派生類與基類之間的關系,它是一種‘是‘的關系,比如白馬是馬,人是動物。

當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如老師是人,學生是人

2.組合的方式

用組合的方式建立了類與組合的類之間的關系,它是一種‘有’的關系,比如教授有生日,教授教python和linux課程,教授有學生s1、s2、s3...

組合與繼承的區別代碼描述:

class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex

class Course:
def __init__(self,name,period,price):
self.name=name
self.period=period
self.price=price
def tell_info(self):
print(‘<%s %s %s>‘ %(self.name,self.period,self.price))

class Teacher(People):
def __init__(self,name,age,sex,job_title):
People.__init__(self,name,age,sex)
self.job_title=job_title
self.course=[]
self.students=[]


class Student(People):
def __init__(self,name,age,sex):
People.__init__(self,name,age,sex)
self.course=[]


egon=Teacher(‘egon‘,18,‘male‘,‘沙河霸道金牌講師‘)
s1=Student(‘牛榴彈‘,18,‘female‘)

python=Course(‘python‘,‘3mons‘,3000.0)
linux=Course(‘python‘,‘3mons‘,3000.0)

#為老師egon和學生s1添加課程
egon.course.append(python)
egon.course.append(linux)
s1.course.append(python)

#為老師egon添加學生s1
egon.students.append(s1)


#使用
for obj in egon.course:
obj.tell_info()

當類之間有顯著不同,並且較小的類是較大的類所需要的組件時,用組合比較好

第二十四天 PYTHON學習