動態方法與靜態方法 面向物件的特徵之一:繼承 屬性查詢 多繼承問題
day27 離考試又近了一天
動靜態方法
動態方法
1.繫結給物件的方法 最常見
2.繫結給類的方法 常見
3.靜態方法 少見
面向物件的三大特性之一: 繼承 (拿來吧你!!!)
面向物件的三大特性分別是: 繼承、封裝、多型 往後的實際應用主要是繼承 其他兩個主要是一些概念 沒有具體的表現形式
繼承的含義
現實生活中繼承是用來描述人與人之間資源的從屬關係
eg:兒子繼承父親 那麼就可以擁有父親的一切(別墅、豪車...)
面向物件中繼承則是用來描述類與類之間資料的從屬關係
eg:類A繼承了類B 那麼類A就可以使用類B中所有的資料(資料、功能..)
繼承的目的
現實生活中通過繼承可以快速的積累財富少奮鬥N多年 並且可以多繼承
eg:可以認多個爹 傍多個富婆 (舉個例子 現實中不可取不可取)
面向物件中通過繼承可以減少程式碼冗餘 提升開發效率 同樣也支援多繼承
eg:類A可以繼承多個類同時擁有多個類裡面的程式碼使用權
繼承的基本使用
class A(B):
pass
我們將被繼承的類稱為:父類或者基類 指代B
繼承別人的類稱為:子類或者派生類 指代A
在python中一個類可以同時繼承多個父類
class A(B,C,D): # B\C\D都是父類 都可以繼承
pass
抽象:由下往上抽取相同特徵 eg:學生和教師推匯出人類 由兒子推導到父親再推導到爺爺 繼承:由上往下直接白嫖資源 eg:學生和教師可以直接繼承人類的功能和資料 """ 在面向物件程式設計中 其實類和父類的主要功能都是用來減少程式碼冗餘的 物件:資料與功能的結合體 類:多個物件相同資料和功能的結合體 父類:多個類相同資料和功能的結合體 """
#############################################
'''名字的查詢順序永遠都是 先從當前物件自身開始查詢'''
#############################################
名字的查詢順序是
先從物件自己的名稱空間中查詢 沒有則去類裡面的名稱空間查詢
先找物件 >>> 再找類
'''注意設定值的情況下是在自身的名稱空間中新增或者修改資料'''
2.單繼承的情況下
名字的查詢順序是
先從物件自己的名稱空間中查詢 沒有擇取產生物件的類中查詢
如果還沒有並且類有父類則去父類中查詢 以此往復下去!!!
查詢順序 物件 >>> 類 >>> 父類
經典案例 搞你腦子
3.多繼承的情況下(瞭解)
經典類與新式類的概念
在python2中存在經典類與新式類
在python3中只有新式類
區分的關鍵在於是否繼承了一個預設的object類
新式類:直接或者間接繼承了object或者其子類的類
經典類:不繼承任何的類
# 在python 2 中 class A: pass print A.__bases__ # 空的 print(A.__bases__) # (<class 'object'>,)
為了相容python2和python3
有時候我們在定義類的時候會習慣性的寫
class MyClass(object):
pass
強度:研究菱形和非菱形問題object不參與圖形構建 非菱形繼承的情況下 父類中名字的查詢順序就是按照繼承時從左往右依次查詢 如果多個父類還有分類 那麼遵循"深度優先" 一條道走到黑 ADBECF 菱形繼承的情況下 父類中名字的查詢順序就是按照繼承時從左往右依次查詢 如果多個父類還有分類 那麼遵循"廣度優先" 再走深度 ADBECFM
如果自己寫的子類需要使用父類的方法 並且還需要基於該方法做擴充套件
這樣的子類我們稱之為派生類(本質還是子類)
那麼可以使用super關鍵字來實現