抽象基类

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

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

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

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

 

具体例子:

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 。

 

 



posted @ 2019-04-09 15:35  魔法少女希维尔  阅读(390)  评论(0编辑  收藏  举报