ABC模块的使用

ABC模块的使用

ABC(Abstract Base Class)模块提供了在Python中定义抽象类的方法。

在Python中没有强的类型检查;因此在执行操作的时候,并不需要所操作的对象是严格继承自某一个基类的。只要由相关的属性,就可以访问。但是由的时候,我们会有需求:一些类定义共同的接口,否则抛出异常;虽然也可以通过hasattr()来实现,但是终归是很麻烦。而ABC模块就可以帮我们实现这个功能。所以,Python中的抽象类和C++中的概念和C++中的还是有一些不一样。

abc.ABCMeta

用来定义抽象类的元类。使用该元类来定义一个抽象类。

定义一个抽象基类的方法是将一个类的元类设置为abc.ABCMeta

抽象基类的继承有两种方式:
1. 继承。
2. 注册。

代码实现如下:

# coding: utf-8
from abc import ABCMeta, abstractmethod

class MyABC:
    __metaclass__ = ABCMeta

    @abstractmethod
    def amtest(self):
        """abstractf method"""


class InheritImpl(MyABC):
    def amtest(self):
        print 'InheritImpl'


class RegisterImpl:
    def amtest(self):
        print 'RegisterImpl'

MyABC.register(RegisterImpl)

if __name__ == '__main__':
    ii = InheritImpl()
    ii.amtest()

    ri = RegisterImpl()
    ri.amtest()

    print issubclass(InheritImpl, MyABC)
    print issubclass(RegisterImpl, MyABC)

代码输出:

InheritImpl
RegisterImpl
True
True

可见InheritImpl和RegisterImpl都使MyABC的子类,继承并实现了虚函数。

使用直接继承的方式,如果子类中没有完全实现相应的虚接口,那么在执行的时候就会报错,但是如果使注册的方式,就没有该限制。

@abstractmethod和@abstractproperty

在上例中,用@abstractmethod声明一个基类中的函数使虚函数。除了该装饰器外,还有@abstractproperty声明一个抽象属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值