zoukankan      html  css  js  c++  java
  • 归一化设计,抽象类和接口类,接口隔离操作

    一:什么叫归一化设计:

    首先来看看下面这段程序:

    class Alipay(Payment):
        def pay(self,money):
            print('使用支付宝支付了%s元'%money)
    
    class QQpay:
        def pay(self,money):
            print('使用qq支付了%s元'%money)
    
    def pay(a,money):
        a.pay(money)         #做归一化设计
    
    
    a = Alipay()
    pay(a,100) 
    q = QQpay()
    pay(q,100)
    View Code

    归一化设计就是要求:不管哪一个类的对象,都调用同一个函数去完成相似的功能。

    ps:依赖倒置原则如下:

    高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。

    二:接口类和抽象类

    1,抽象类与接口类就是建立规范的,制定一个类的metaclass是ABCMeta,那么这个类就变成了一个抽象类(接口类)。

    2,抽象类中所有被abstractmethod装饰的方法都必须被继承的子类实现,如果不实现,那么在实例化阶段将会报错。

    3,无论是抽象类还是接口类metaclass=ABCMeta 都不可以被实例化。

    from abc import ABCMeta,abstractmethod
    class Payment(metaclass=ABCMeta):    # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
        @abstractmethod
        def pay(self):pass  # 抽象方法
    
    class Alipay(Payment):
        def pay(self,money):
            print('使用支付宝支付了%s元'%money)
    
    def pay(a, money):
        a.pay(money)
    
    a = Alipay()
    pay(a,100)
    View Code

    三:接口隔离操作

    1,什么叫接口?

    python里并没有接口的概念,那接口是哪儿来的概念呢?因为java类没有多继承,接口可以实现多继承。而在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了.

    2,抽象类和接口类在python中是相同的,都是用于约束子类中的方法的,只要是抽象类和接口类中被abstractmethod装饰的方法,都需要被子类实现。需要注意的是,当多个类之间有相同的功能也有不同的功能的时候,应该采用多个接口类来进行分别的约束

    3,在java中,抽象类和接口截然不同,抽象类的本质还是一个类,是类就必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么它只能被一个父类控制,当多个类之间有相同的功能也有不同的功能的时候,java只能用接口来解决问题。

    from abc import ABCMeta,abstractmethod
    class FlyAnimal(metaclass=ABCMeta):
        @abstractmethod
        def fly(self):pass
        @abstractmethod
        def cal_flying_speed(self):pass
        @abstractmethod
        def cal_flying_height(self):pass
    class WalkAnimal(metaclass=ABCMeta):
        @abstractmethod
        def walk(self):pass
    class SwimAnimal(metaclass=ABCMeta):
        @abstractmethod
        def walk(self):pass
    class Tiger(WalkAnimal,SwimAnimal):
        def walk(self):pass
        def swim(self):pass
    class Monkey:
        def walk(self):pass
        def climb(self):pass
    class Swan(FlyAnimal,WalkAnimal,SwimAnimal):
        def swim(self):pass
        def walk(self):pass
        def fly(self):pass
        def cal_flying_speed(self):pass
        def cal_flying_height(self):pass
    class Parrot(FlyAnimal):
        def fly(self):pass
        def cal_flying_speed(self):pass
        def cal_flying_height(self): pass
    View Code

     ps:接口隔离原则如下:

    使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。

  • 相关阅读:
    #pragam预处理分析
    #error和line
    Appium+Robotframework实现Android应用的自动化测试-4:AppiumLibrary介绍和安装
    Appium+Robotframework实现Android应用的自动化测试-3:一个必不可少的工具介绍
    Appium+Robotframework实现Android应用的自动化测试-2:Windows中启动Appium和模拟器
    python程序打包成.exe----pyinstaller工具
    python: extend (扩展) 与 append (追加) 的差别
    2小时入门Robot Framework
    sizeof进行结构体大小的判断
    Python 包管理工具解惑
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8856408.html
Copyright © 2011-2022 走看看