Loading

接口类 和 抽象类

抽象类和接口类

首先需要明确的是接口类和抽象类是由java语言中发展来的概念,它是java中的一种设计规范或方法。

Python提供了对抽象类的支持借助于 abc 模块

Python中可以沿用接口类的概念编程但是 Python不提供具体的实现方式,也就是说 Python中并没有接口类 但是依然可以使用接口类的设计方式来规范代码

接口类的设计提倡功能设计的简单,专一,不要将接口设计的臃肿而复杂。接口需要尽可能的降低耦合,遵循接口隔离原则。

抽象类推荐单继承,接口类的使用鼓励多继承(细化接口,依据实际需求把握粒度)。

抽象类

抽象类是抽取多个功能具有相似点的类而形成的新类,由于它是多个类的共同点的抽象,因此它天生就是为继承而存在。

抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化

允许在类内部实现某些方法,抽象类的内部允许一般的实例方法,而不一定都要是抽象方法

抽象类要将子类中一致的方法实现,这样避免在多个子类中重复的实现一样的方法造成冗余。例如BasePerson类中实现了sleep方法,因为所有的人都会睡觉,且睡觉的行为一致。但是say方法没有实现,因为不同的角色说话的方式是不同的,需要在子类中自己来实现。

接口类

严格的讲Python中就没有 接口类这么个东西。仅仅对抽象类提供支持 abc。但是接口隔离的思想依然是可以用的。靠程序员自己来约束,不要被定义和名称框死,也没必要过分纠结~ 。毕竟我们最终目的是写出优雅稳健的代码。

  • 接口类中不允许有构造方法
  • 接口类中必须不能实现任何方法
  • 接口类定义需要遵循接口隔离原则和单一化原则
  • 接口隔离:尽可能的将接口粒度细化。
  • 单一原则:尽可能将接口的职责单一化。

例子

import abc


class Developer(metaclass=abc.ABCMeta):
    """这个 看似他遵循了接口类的定义~ 但是仅仅是为了遵循接口隔离设计思想。"""
    @abc.abstractmethod
    def coding(self):pass

    @abc.abstractmethod
    def debug(self):pass


class Teacher(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def teach(self):pass


class BasePerson(metaclass=abc.ABCMeta):
    """ 抽象类"""
    @abc.abstractmethod
    def say(self):pass  # 抽象方法

    def sleep(self):    # 可以实现方法,并且不要求子类必须实现这个方法。
        print("我会睡觉")


class ComputerTeacher(BasePerson,Developer,Teacher):
    def coding(self):
        print("我会编程")

    def teach(self):
        print("我会教学生")

    def say(self):
        print("我将会教学生一些编程的方法和技巧!")

    def debug(self):
        print("天天就会写bug!!!")


a = ComputerTeacher()
a.say()
a.sleep()
a.teach()
a.coding()
a.debug()
posted @ 2020-06-18 18:17  StKali  阅读(214)  评论(0编辑  收藏  举报