繼承的另一種使用方式。。。

2022-04-10 19:23:04 字數 3260 閱讀 5134

--1、之前講的有繼承關係的類都是我們新建的,不常用

--2、最常用的是直接繼承乙個已經存在的類

--當你想要建立乙個新的類時 ,發現這個類中的一些功能在另外的某個類中存在

我們就沒必要從頭開始重寫這些功能,可以直接繼承已有的類,然後做補充

注:假如我們時需要父類中的初始化屬性,並且還需要新增點屬性,那麼必須覆蓋父類的__init__方法

先通過super()方法重用父類屬性,再新增自己新增的初始化屬性或者方法

python中支援多繼承:乙個子類可以同時擁有多個父類

優點:可以讓**變得更加靈活

缺點:屬性查詢順序需要通過c3演算法來確定

多繼承時如果多個父類出現相同名稱的屬性或者函式

查詢的順序要根據mro列表來確定

總結:super()在訪問父類屬性時,是按照mro列表一層一層往上找的

eg:(哪個類的物件呼叫,就遵循這個類的mro列表查詢順序)

class

a:

deftest(self):

print('

from a')

super().test()

#a的父類應該是object

#但是super()是根據mro列表訪問順序來查詢的

class b: #

[, , , ]

def test(self): #

對與c來說mro列表b在a之後,所以a裡面的super訪問到的就是b裡的函式

print('

from b

') 

class

c(a,b):

#def test(self):

#print('from c')

pass

c =c()

c.test()

print(c.mro())

組合指的是乙個類把另乙個類的物件作為自己的屬性  -->這就叫做組合

組合與繼承的區別:

相同點:都是為了重用**,減少**的冗餘

不同點:

--組合      把另乙個類的物件作為自己屬性的類產生的物件,可以通過物件點出另乙個類的物件再點出

另乙個物件的屬性和行為

--繼承  乙個類繼承另乙個類,那麼這個類的物件可以點出被繼承的類中的屬性和方法

組合的例子:

class a:

def __init__(self):

pass

class b:

def __init__(self,obj):

self.obj = obj

a = a()  # a可以使用a類中的屬性和方法

b = b(a)     b可以使用b中的屬性和方法   b.obj就是a物件也可以使用a類中的屬性和方法了

新式類:

直接或者間接繼承object類(基類)的類稱為新式類

經典類:

沒有直接或者間接繼承object類(基類)的類稱為經典類

菱形繼承:

指的是乙個子類有多個父類,並且這些多個父類又繼承同乙個父類

菱形繼承產生的問題:

如果多個父類有相同名稱的屬性或者是相同名稱的行為,那麼屬性查詢的順序就不能按之前的順序來查詢

會通過c3演算法得出乙個mro列表,可以通過子類直接點出mro方法來檢視mro列表

屬性查詢順序是根據mro列表來查詢

抽象類

抽象:指的是不清楚的,不具體的,看不懂

抽象方法

指的是 沒有具體函式體的方法,

用@abc.abcstractmethod裝飾器 -->子類繼承它的時候必須明確抽象方法下面的函式體

抽象類及特點

定義:如果類中具備抽象方法,那麼這個類就稱為抽象類

特點:不能直接例項化,必須有子類覆蓋了所有抽象方法之後才能例項化子類

介面

介面理解:

當乙個物件的類裡面有其他類物件作為方法,並且類方法內其他類物件具有一系列方法 # (按組合理解)

那麼想要執行類的方法就必須把其他類產生的物件傳進去,

並且這個其他類必須按照類裡面的方法來定義自己的方法

所以介面就是一套協議規範

具體表現形式:類中有一堆函式,但是只明確了函式的名稱,沒有明確函式的具體實現

優點:#1、使用介面可以提高程式的擴充套件性

#2、只要物件按照介面規定方法來實現,使用者就可以無差別使用所有物件

問題:如果介面的子類沒有實現介面中的方法,那是沒有任何意義的

抽象類之所以出現的意義

就是通過抽象類來強行限制子類必須覆蓋所有抽象方法

class

pc:

defconnect_device(self,device):

device.open()

device.working()

device.close()

class

usb:

@abc.abcstractmethod

#usb想要使用電腦物件中的功能,就必須按照pc類中方法下面連線裝置的方法來定義

def open(self): #

只要滿足pc類方法下面的幾個方法,那麼把usb物件傳進去就能被識別

pass

#而這個只有方法,沒有函式體的就被稱為介面,主要作用是作為以重協議規定

@abc.abcstractmethod

def working(self): #

讓其他想要使用電腦物件中功能的裝置照著這個規定來定義自己的類

pass

@abc.abcstractmethod

defclose(self):

pass

pc = pc() #

電腦物件

usb = usb() #

usb物件 (不能例項化,為了下面理解使用功能,會報錯)

pc.connect_device(usb) #

這樣就可以使用電腦中的功能了

介面與抽象類的區別

介面中的所有方法都是抽象方法,而有乙個抽象方法的類就是抽象類

定義:指的是乙個物件如果長得像鴨子(屬性/特徵),叫聲像鴨子,走路像鴨子(方法/行為),

那麼它就是鴨子,就可以把他當鴨子使用

意思是:

如果你的屬性的行為都是按照介面的規範定義的,那麼即便你不是介面的子類,

那麼(電腦)中的方法你依舊可以使用

繼承外另一種重用方式 組合

軟體重用的重要方式除了繼承之外還有另外一種方式 組合。組合指的是,在乙個類中以另外乙個類的物件 也就是例項 作為資料屬性,稱為類的組合。也就是說,乙個類的屬性是另乙個類的物件,就是組合。class equip 裝備類 def fire self print release fire skill cl...

for迴圈的另一種方式

語法 for expr1 expr2 expr3 do done 解釋 expr1 控制變數的初始值 expr2 判定什麼時候退出迴圈 expr3 修正這個變數的值 範例 計算1到100之間的數值的和 這裡面 有倆種方式 最普通的是我們想到的是 1到100之間的數列,另一種是今天的小知識點的運用 這...

Intent的另一種啟動方式

在閱覽別人的 時,看到別人是這麼啟動另外乙個activity的 newsinfoactivity.actionstart mcontext,item.getlink 當時就覺得很奇怪,第一次見嘛,然後我就到這個newsinfoactivity類中查actionstart方法,發現 public st...