1. 程式人生 > 其它 >動態方法與靜態方法 面向物件的特徵之一:繼承 屬性查詢 多繼承問題

動態方法與靜態方法 面向物件的特徵之一:繼承 屬性查詢 多繼承問題

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:學生和教師可以直接繼承人類的功能和資料 

"""
在面向物件程式設計中 其實類和父類的主要功能都是用來減少程式碼冗餘的

物件:資料與功能的結合體
類:多個物件相同資料和功能的結合體
父類:多個類相同資料和功能的結合體
"""

 

名字的查詢順序

 

#############################################
'''名字的查詢順序永遠都是 先從當前物件自身開始查詢'''
#############################################

 

1.不繼承的情況下

名字的查詢順序是
  先從物件自己的名稱空間中查詢 沒有則去類裡面的名稱空間查詢


          先找物件 >>> 再找類


'''注意設定值的情況下是在自身的名稱空間中新增或者修改資料'''

 

 

 

 

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關鍵字來實現