抽象基类

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

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

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

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

 

具体例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Animal(object):<br>   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方法的时候就会报错。很显然,这种直接继承的方法就是实现了实例化后,调用的时候才报错。

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

抽象基类的使用方法:

 

 

1
2
3
4
5
6
7
8
9
10
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 @   魔法少女希维尔  阅读(417)  评论(0)    收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示