zoukankan      html  css  js  c++  java
  • 4-16 归一化,抽象类,接口类,多态

    1,归一化

    接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能

    python中的len()函数很好说明了归一化

    归一化设计
    l = [1,2,2]
    l2 = {1,2,3,4}
    l3 = (1,2)
    a = '1234567'
    print(len(l))
    print(l3.__len__())
    len()  和 __len__()
    只有一个类中实现了__len__()方法,才能使用len()函数
    def len2(obj):  # 归一化设计
        return obj.__len__()
    
    print(len(l))
    print(len(l2))
    print(len(l3))
    View Code

    2,抽象类

      与java一样,python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。

    from abc import ABCMeta,abstractmethod
    class Payment(metaclass=ABCMeta):    # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
    @abstractmethod
    抽象类和接口类做的事情 :建立规范
    制定一个类的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)
    
    class QQpay(Payment):
        def pay(self,money):
            print('使用qq支付了%s元'%money)
    
    class Wechatpay(Payment):
        def pay(self,money):
            print('使用微信支付了%s元'%money)
        def recharge(self):pass
    
    def pay(a,money):
        a.pay(money)
    
    a = Alipay()
    a.pay(100)
    pay(a,100)    # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
    q = QQpay()
    # q.pay(100)
    pay(q,100)
    w = Wechatpay()
    pay(w,100)   # 到用的时候才会报错
    View Code

    python 的编程原则:

      1,开发封闭原则,开放,就是对扩展开放,封闭,对修改是封闭的。

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

      3,接口隔离原则,在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了。

    3,接口类

    在python 中没有接口的概念。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

    接口类的作用:

        在java中,能够满足接口隔离原则,且完成多继承的约束
    而在python中,满足接口隔离原则,由于python本身支持多继承,所以就不需要接口的概念了

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

    在java中
    抽象类和接口截然不同
    抽象类的本质还是一个类 是类就必须遵循单继承的规则,所以一个子类如果被抽象类约束,那么它只能被一个父类控制
    当多个类之间有相同的功能也有不同的功能的时候 java只能用接口来解决问题
    4,多态
    python语言是介于强类型语言和弱类型语言。属于动态强类型语言。
    无论是python2X还是python3x中,都天生自带多态效果。
    python的鸭子类型:
    不是通过具体的继承关系来约束某些类中必须有哪些方法名
    是通过一种约定俗成的概念来保证在多个类中相似的功能叫相同的名字






  • 相关阅读:
    放一个Dynamicinputs corresponding to Dynamicknobs的Node源码
    NDK学习笔记(四):OutputContext机制
    NDK学习笔记(三):DynamicKnobs的机制
    OpenEXR的采样机制
    OpenEXR的读取机制
    OpenEXR的输出机制
    虚拟机中安装centOS及破解nuke的方法
    OpenEXR-2.2.0在Win7 x64系统下的安装方法
    NDK学习笔记(二)
    NDK学习笔记(Add.cpp注释)(一)
  • 原文地址:https://www.cnblogs.com/yzxing/p/8856483.html
Copyright © 2011-2022 走看看