zoukankan      html  css  js  c++  java
  • 接口类 和 抽象类

    抽象类和接口类

    首先需要明确的是接口类和抽象类是由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()
    
  • 相关阅读:
    JAVA程序员面试32问
    在做物流的库存管理系统里,需要注意。。。。。
    在写自动更新程序中出现的问题
    数据库设计中的五个范式
    cPickle / pickle
    python总结1
    python总结2
    汉明距离(Hamming distance)
    python中pickle的用法
    NET面试题
  • 原文地址:https://www.cnblogs.com/monkey-code/p/13159044.html
Copyright © 2011-2022 走看看