在python中類 通過繼承metaclass =abcmeta
類來建立抽象類,抽象類是包含抽象方法的類,其中abcmeta類(metaclass for defining abstact baseclasses,抽象基類的元類)
是所有抽象類的基類。
定義了抽象類後,在要實現抽象方法的前一行使用@abc.abstractmethod
來定義抽象方法。抽象方法不包含任何可實現的**,只能在子類中實現抽象函式的**。
抽象類的特點:
注意:抽象基類的使用:
直接繼承抽象基類的子類就沒有這麼靈活,抽象基類中可以宣告」抽象方法「和「抽象屬性」,只有完全重寫
(實現)了抽象基類中的「抽象」內容後,才能被例項化,而虛擬子類則不受此影響。
將其他的類」註冊「到抽象基類下當虛擬子類(呼叫register方法),虛擬子類的好處是你實現的第三方子類不需要直接繼承自基類,可以實現抽象基類中的部分api介面,也可以根本不實現,但是issubclass(), issubinstance()進行判斷時仍然返回真值。
例:定義乙個抽象基類的簡單方法: 首先在dog,duck都繼承自animal。 在animal中定義了eat和run兩個方法,任何從animal中繼承的子類都必須實現eat和voice方法。否則呼叫的時候會報錯
import abc
class
animal
(metaclass=abc.abcmeta)
:# 繼承自metaclass=abc.abcmeta,表明這是乙個抽象類
@abc.abstractmethod # 被abc.abstractmethod所裝飾的方法為乙個抽象方法
defeat
(self)
:pass
@abc.abstractmethod
defrun(self)
:# 這格式乙個抽象方法
pass
class
dog(animal)
:"""
繼承animal這個抽象類,則需要實現這個抽象類中的所有抽象方法,否則無法例項化
"""defeat
(self)
:print
("dog is eating"
)def
run(self)
:print
("dog is running"
)class
duck
(animal)
:"""
繼承animal這個抽象類,則需要實現這個抽象類中的所有抽象方法,否則無法例項化
"""defeat
(self)
:print
("duck is eating"
)# def run(self):
# print("duck is running")
dog = dog(
)duck = duck(
)dog.eat(
)dog.run(
)duck.eat(
)# 該方法重寫了,但是抽象父類中的run()抽象方法沒有被重寫,則該類無法例項化
#結果
traceback (most recent call last)
: file "d:/py3.7project/sample/chapter01/all_is_object.py"
, line 80,in
duck = duck(
)typeerror: can't instantiate abstract class
duck
with abstract methods run
結果顯示無法例項化,提示沒有實現eat方法。這樣就達到了我們的目的即沒有實現抽象基類的所有方法就無法例項化 JAVA中的終結類 終結方法 和 抽象類 抽象方法
一.終結類與終結方法 用final修飾的類和方法 1.終結類不能被繼承 2.終結方法不能被子類覆蓋 栗子 終結類 final class a 宣告a類 為final類 class b extends a 編譯器將會報錯 栗子 終結方法 class parent 構造方法 final int getp...
抽象方法和抽象類
思想 利用通用介面建立的一種基本形式,以此表示所有匯出類的共同部分 概念 1 抽象方法 僅有宣告,沒有方法體 2 抽象類 含抽象方法的類 要點 抽象類可以不含抽象方法 抽象類不能被例項化 不能使用 new 關鍵字 子類繼承抽象父類而不提供方法定義,則子類也必須為抽象類 抽象類可以包含屬性 方法 構造...
抽象方法和抽象類
1.什麼是抽象方法 定義 乙個方法如果沒有方法體 乙個方法不使用 直接使用分號結束的方法,才是沒有方法體的方法 則這個方法就是抽象方法 一 宣告乙個方法,不適用 而直接分號結束 二 如果是抽象方法,必須使用 abstract 抽象關鍵字來修飾 三 不是抽象類,不可以使用抽象方法 2.什麼是抽象類 一...