zoukankan      html  css  js  c++  java
  • 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的本质是一门动态编程语言,其目的就是给你更多灵活性, 强制类型检查或让你代码变得更复杂,这样做无异于舍本求末。

  • 相关阅读:
    【Python爬虫】第五课(b站弹幕)
    【Python爬虫】第四课(查询照片拍摄地址)
    一些tips
    【Python爬虫】第三课(提取数据)
    【Python爬虫】第二课(请求头设置)
    【Python爬虫】第一课
    【数据分析】如何进行数据分析
    【数据分析】派单排序策略优化验证(附sql查询代码)
    python基础01
    消息
  • 原文地址:https://www.cnblogs.com/sunch/p/13408581.html
Copyright © 2011-2022 走看看