• 抽象基类


    抽象基类不同于普通的父类。

    普通父类,一般子类会直接继承。

    抽象基类是在设计基类时就规定了子类如果继承该基类,必须实现的方法。

    如果子类没有实现抽象基类实现的方法,那么子类在实例化的时候就会报错,提示没有实现规定的方法。而不是在调用的时候再报错。

    具体例子:

    class Animal(object):
       def eat(self): raise NotImplementedError    def voice(self): raise NotImplementedError class Dog(Animal): def voice(self): print 'wow....' class Bird(Animal): def voice(self): print 'jiji....' class Cow(Animal): def voice(self): print 'Oh.....' if __name__ == "__main__": d=Dog() d.voice() d.Eat()

     最后三个类会实现voice方法,但是在调用traceback到eat方法的时候就会报错。很显然,这种直接继承的方法就是实现了实例化后,调用的时候才报错。

    而有的时候,我们需要的是,在实例化的时候就告诉我们报错。这个时候就需要这样使用抽象基类。

    抽象基类的使用方法:

    import abc
    class Animal(object):
        __metaclass__ = abc.ABCMeta
        @abc.abstractmethod
        def eat(self):
            return
        @abc.abstractmethod
        def voice(self):
            return 
    class Dog(Animal):
        def voice(self):
            print 'wow....

        def eat(self):
            print 'Dog eat....'

    class Bird(Animal):
        def voice(self):
            print 'jiji....'

    if __name__ == "__main__": d=Dog()
      c=Bird()

     使用了抽象基类的话,这个在实例化Bird类的时候,就会报错没有实现规定的eat方法。

    用抽象基本类的地方:
        1:用作父类
        2:用作检验实例类型
        3:用作抛出异常说明

        1:直接继承
            直接继承抽象基类的子类就没有这么灵活,抽象基类中可以声明”抽象方法“和“抽象属性”,只有完全覆写(实现)了抽象基类中的“抽象”内容后,才能被实例化,而虚拟子类则不受此影响。
        2:虚拟子类
        将其他的类”注册“到抽象基类下当虚拟子类(调用register方法),虚拟子类的好处是你实现的第三方子类不需要直接继承自基类,可以实现抽象基类中的部分API接口,也可以根本不实现,但是issubclass(), issubinstance()进行判断时仍然返回真值。
        Python 对于ABC的支持模块是abc模块,定义了一个特殊的metaclass:ABCMeta 还有一些装饰器:@abstractmethod 和 @abstarctproperty 。abc.ABCMeta 用于在Python程序中创建抽象基类。而抽象基类如果想要声明“抽象方法”,可以使用 @abstractmethod ,如果想声明“抽象属性”,可以使用 @abstractproperty 。



  • 相关阅读:
    iOS-Core Text 入门
    Mac浏览器全屏设置
    Quartz 2D - 图形上下文(Graphics Contexts)
    Quartz 2D 概述
    Quartz 2D官方文档翻译(持续更新中)
    那些年,我们常掉进去的坑
    CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算的原理 (转载)
    科大讯飞
    Object-C语言类的扩展
    科大讯飞语音识别
  • 原文地址:https://www.cnblogs.com/shrimpPython/p/10677254.html
Copyright © 2020-2023  润新知