Python中的抽象类和接口类

抽象类

约束子类中必须包含某些方法

#!./usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2020-07-31
# Author: Jimmy
import abc


class Walk(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def walk(self):
        # 抽象方法,此处无需实现
        pass

    def slow_walk(self):
        # 普通方法,可以自己实现
        print('我在慢悠悠的走 ~')


class Swim(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def swim(self):
        # 抽象方法,此处无需实现
        pass

    def slow_swim(self):
        # 普通方法,可以自己实现
        print('我在慢悠悠的游 ~')


class Fry(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def fry(self):
        # 抽象方法,此处无需实现
        pass

    def slow_fry(self):
        # 普通方法,可以自己实现
        print('我在慢悠悠的游 ~')


class Tiger(Walk, Swim):
    def walk(self):
        # 必须实现抽象方法,不实现,实例化的时候会报错
        print('我是一只老虎,我在散步 ~')

    def swim(self):
        # 必须实现抽象方法,不实现,实例化的时候会报错
        print('我是一只老虎,我在游泳 ~')


class Bird(Walk, Fry):
    def walk(self):
        # 必须实现抽象方法,不实现,实例化的时候会报错
        print('我是一只小小鸟,我在散步 ~')

    def fry(self):
        # 必须实现抽象方法,不实现,实例化的时候会报错
        print('我是一只小小鸟,我在飞翔 ~')

    def slow_fry(self):
        # 可以重写抽象类的slow_fry
        print('我是一只小小鸟,我在按照我自己的节奏慢悠悠的飞 ~ ')


tiger = Tiger()
bird = Bird()
tiger.slow_walk()
bird.slow_fry()

Walk Swim Fry在定义上可以理解为抽象类

Walk Swim Fry不全是抽象方法

接口类

注意:Python中无接口这个概念

约束子类中必须包含父类规定的方法

#!./usr/bin/env python
# -*- coding: utf-8 -*-
# Date: 2020-07-31
# Author: Jimmy
import abc


class Walk(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def walk(self):
        # 抽象方法,此处无需实现
        pass

    @abc.abstractmethod
    def slow_walk(self):
        # 抽象方法,此处无需实现
        pass


class Swim(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def swim(self):
        # 抽象方法,此处无需实现
        pass

    @abc.abstractmethod
    def slow_swim(self):
        # 抽象方法,此处无需实现
        pass


class Fry(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def fry(self):
        # 抽象方法,此处无需实现
        pass

    @abc.abstractmethod
    def slow_fry(self):
        # 抽象方法,此处无需实现
        pass


class Tiger(Walk, Swim):
    def walk(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只老虎,我在散步 ~')

    def slow_walk(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只老虎,我在慢悠悠的走 ~')

    def swim(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只老虎,我在游泳 ~')

    def slow_swim(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只老虎,慢悠悠的游 ~')


class Bird(Walk, Fry):
    def walk(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只小小鸟,我在散步 ~')

    def slow_walk(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只小小鸟,我在慢悠悠的走 ~')

    def fry(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只小小鸟,我在飞翔 ~')

    def slow_fry(self):
        # 必须实现,不实现,实例化的时候会报错
        print('我是一只小小鸟,我在慢悠悠的飞翔 ~')


tiger = Tiger()
bird = Bird()

Walk Swim Fry 从定义上可以理解为接口类

Walk Swim Fry全是抽象方法

总结

相同

  • 都有抽象方法
  • 都不可以实例化

区别

  • 抽象类:约束子类中必须包含某些方法 // 弱约束
  • 接口类:约束子类中必须包含父类规定的方法 // 强约束

注意

  • 接口类,python 原生不支持 在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念

  • 1.多继承问题
    在继承抽象类的过程中,我们应该尽量避免多继承;
    而在继承接口的时候,我们反而鼓励你来多继承接口
    
    2.方法的实现
    在抽象类中,我们可以对一些方法做出基础实现;
    而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现
    
  • 尽管ABCs可以让我们很方便的做类型检查,但是我们在代码中最好不要过多的使用它。 因为Python的本质是一门动态编程语言,其目的就是给你更多灵活性, 强制类型检查或让你代码变得更复杂,这样做无异于舍本求末。

posted @ 2020-07-31 11:12  孙昌恒  阅读(500)  评论(0编辑  收藏  举报