抽象基类
抽象基类不同于普通的父类。
普通父类,一般子类会直接继承。
抽象基类是在设计基类时就规定了子类如果继承该基类,必须实现的方法。
如果子类没有实现抽象基类实现的方法,那么子类在实例化的时候就会报错,提示没有实现规定的方法。而不是在调用的时候再报错。
具体例子:
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 。