python抽象基類理解

2021-10-03 19:45:28 字數 1635 閱讀 3570

抽象基類它提供了介面,但是又沒有去把介面實現的類,需要由子類完成。感覺它就是老闆,只告訴你要完成專案a, 你接到專案a後(繼承),你自己去把它完成。

抽象基類特點:

1.繼承類必須實現抽象基類的方法

2.抽象基類無法例項化

1.why 抽象基類?

譬如要開發乙個專案,你要規定專案開發者要去完成某些介面,有些介面會不會忘記實現了呢?你在擔心…這時候抽象基類就幫上忙了,你可以給開發者提供抽象基類,因為它必須讓繼承它的子類去實現它所要求的方法(這個例子不知道牽強不?)。當然也有其他的優點:處理繼承問題方面更加規範、系統,明確呼叫之間的相互關係,使得繼承層次更加清晰。

2.為什麼抽象基類用collections.abc?

假設我們要編寫一種物件,本身雖然不屬於list子類,但是卻要讓它可以像list那樣子去訪問。例如我們現在想讓一顆二叉樹可以像list那樣子訪問,那麼我們要實現__geitem__(),要實現__len__(),這個還不完整,還要實現index, count方法,要實現那麼多方法很複雜,用collections.abc模組的話,實現了抽象基類所要求的方法,模組會自動實現剩下的那些方法。

我們一般都不會自己去定義抽象基類,而是使用collections.abc模組

例如:

import abc

class

a(abc.abc)

:#自己定義乙個抽象基類,

@abc.abstractmethod

defeat(self)

:pass

class

b(a)

:#繼承抽象基類

defvoice

(self)

:pass

if __name__ ==

"__main__"

: a = a(

)#報錯,抽象類無法實現例項化

#typeerror: can't instantiate abstract class a with abstract methods eat

a = b(

) a.eat(

)#報錯,繼承類必須實現抽象類的方法

#typeerror: can't instantiate abstract class b with abstract methods eat

又如:

from collections import abc

class

a(abc.sequence)

:#繼承抽象基類abc,sequece

defeat

(self)

:pass

class

b(a)

:def

__getitem__

(self)

:#必須實現__getitem__()

pass

def__len__

(self)

:#必須實現__len__()

pass

defvoice

(self)

:pass

if __name__ ==

"__main__"

: b = b(

)

python 中抽象基類簡介

簡介 python中雖然鴨子型別很強大,但鴨子型別也有著不足。具體關於分類可以參照水禽的分類理解。因此,參照水禽的分類學演化,我建議在鴨子型別的基礎上增加白鵝型別 goose typing 白鵝型別指,只要cls是抽象基類,即cls的元類是abc.abcmeta,就可以使用isinstance ob...

python3 抽象基類

1,抽象基類 abstract base class或者 abcs 用於 定義一組必須被類的 鴨子型別 例項實現的方法與屬性,可以繼承抽象基類本身的類作為類的例項,但是必須提供所有適合的方法。from collections.abc import container class testcontai...

ACM 抽象基類

檔名稱 完成日期 2014年6月3日 版本號 v0.1 對任務及求解方法的描述部分 輸入描述 無 問題描述 程式輸入 程式輸出 問題分析 演算法設計 我的程式 include include using namespace std class shape class circle public sh...