Python如何實現抽象類
在python中類 通過繼承metaclass =ABCmeta
類來創建抽象類,抽象類是包含抽象方法的類,其中ABCmeta類(Metaclass for defining abstact baseclasses,抽象基類的元類)
是所有抽象類的基類。
定義了抽象類後,在要實現抽象方法的前一行使用@abc.abstractmethod
來定義抽象方法。抽象方法不包含任何可實現的代碼,只能在子類中實現抽象函數的代碼。
抽象類的特點:
- 抽象類不能被實例化
- 繼承抽象類的類必須實現所有的抽象方法後,才能被實例化
- 抽象類中有抽象方法和正常方法
- 抽象類中可以添加成員屬性
注意:
-
抽象類中的抽象方法,在子類中必須實現該方法
-
抽象類不能被實例化
-
創建抽象方法前,必須先創建抽象類
-
需要導入abc(abstractclass)類
抽象基類的使用:
- 直接繼承
直接繼承抽象基類的子類就沒有這麼靈活,抽象基類中可以聲明”抽象方法“和“抽象屬性”,只有完全重寫
(實現)了抽象基類中的“抽象”內容後,才能被實例化,而虛擬子類則不受此影響。
- 虛擬子類
將其他的類”註冊“到抽象基類下當虛擬子類(調用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所裝飾的方法爲一個抽象方法
def eat(self):
pass
@abc.abstractmethod
def run(self): # 這格式一個抽象方法
pass
class Dog(Animal):
"""
繼承Animal這個抽象類,則需要實現這個抽象類中的所有抽象方法,否則無法實例化
"""
def eat(self):
print("dog is eating")
def run(self):
print("dog is running")
class Duck(Animal):
"""
繼承Animal這個抽象類,則需要實現這個抽象類中的所有抽象方法,否則無法實例化
"""
def eat(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 <module>
duck = Duck()
TypeError: Can't instantiate abstract class Duck with abstract methods run
結果顯示無法實例化,提示沒有實現eat方法。這樣就達到了我們的目的即沒有實現抽象基類的所有方法就無法實例化