Python中的抽象类和抽象方法

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方法。这样就达到了我们的目的即没有实现抽象基类的所有方法就无法实例化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章