抽象類中只能有抽象方法,子類繼承抽象類時,不能通過實例化使用其抽象方法,必須實現該方法。
Python2
class CopyBase(object): def save(self): raise NotImplementedError class CopyPaper(CopyBase): def __init__(self): pass
def save(self): print("copy paper") class CopyQuestion(CopyBase): def __init__(self): pass copy_paper = CopyPaper() copy_paper.save() copy_question = CopyQuestion() copy_question.save() result: copy paper Traceback (most recent call last): copy_question.save() raise NotImplementedError NotImplementedError
這里以NotImplementedError的形式實現了抽象類和抽象方法,如果子類不實現該方法會拋出異常
Python3
在Python3中引入了abc模塊,通過@abc.abstractmethod可以更加簡潔地使用抽象類,抽象方法。
import abc class CopyBase(metaclass=abc.ABCMeta): @abc.abstractmethod def save(self): pass
class CopyPaper(CopyBase): def __init__(self): pass
def save(self): print("copy paper") class CopyQuestion(CopyBase): def __init__(self): pass copy_paper = CopyPaper() copy_paper.save() copy_question = CopyQuestion() copy_question.save() result: copy paper Traceback (most recent call last): copy_question = CopyQuestion() TypeError: Can't instantiate abstract class CopyQuestion with abstract methods save
從abc模塊引入類abstractmethod和類ABCMeta,自定義的CopyBase類繼承抽象類ABCMeta,在類CopyBase中定義save方法,
添加裝飾器abcstractmethod,CopyPaper類和CopyQuestion繼承CopyBase類,分別實例化CopyPaper和CopyQuestion,
CopyQuestion類沒有實現save方法,因此會拋出異常。