抽象基类
抽象基类不同于普通的父类。
普通父类,一般子类会直接继承。
抽象基类是在设计基类时就规定了子类如果继承该基类,必须实现的方法。
如果子类没有实现抽象基类实现的方法,那么子类在实例化的时候就会报错,提示没有实现规定的方法。而不是在调用的时候再报错。
具体例子:
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 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步