python abc模块_Python -- abc module

本文介绍了Python的抽象基类(ABC)模块,用于创建抽象类。ABC模块中的ABCMeta元类可以生成抽象基础类,通过register方法可以注册虚拟子类。文章还展示了如何使用__subclasshook__方法和abstractmethod装饰器定义抽象方法和属性,并通过实例说明了其用法。此外,还讨论了如何检查子类是否符合抽象类的要求。
摘要由CSDN通过智能技术生成

1.ABC模块作用

Python本身不提供抽象类和接口机制,想要实现抽象类,可以借助abc模块。ABC是Abstract Base Class的缩写,是用来定义抽象类的,具体的介绍请参考PEP 3119。

2.模块中的类和函数介绍

abc.ABCMeta,用来生成抽象基础类的元类。由它生成的类可以被直接继承。

register首先注册一个abc的虚拟子类

from abc import ABCMeta

class MyABC:

__metaclass__ = ABCMeta

MyABC.register(tuple)

assert issubclass(tuple, MyABC)

assert isinstance((), MyABC)

上面这个例子中,首先生成了一个MyABC的抽象基础类,然后再将tuple变成它的虚拟子类。然后通过issubclass或者isinstance都可以判断出tuple是不是出于MyABC类。

检查子类是否被确认为ABC的子类。你也可以自己定制一个issubclass方法,这样就不需要再调用register()了。这个方法可以返回Ture,False或NotImplemented。如果返回的是TRUE,这个子类就被认为是ABC的子类了。如果返回FALSE,这个子类就不被认为是ABC的子类。如果是NotImplemented 请检查 子类的继承关系和语法。也可以通过复写__subclasshook__(subclass)来实现相同功能,它必须是classmethod。

下面是一个实用的例子:

class Foo(object):

def __getitem__(self, index):

...

def __len__(self):

...

def get_iterator(self):

return iter(self)

class MyIterable:

__metaclass__ = ABCMeta

@abstractmethod

def __iter__(self):

while False:

yield None

def get_iterator(self):

return self.__iter__()

@classmethod

def __subclasshook__(cls, C):

if cls is MyIterable:

if any("__iter__" in B.__dict__ for B in C.__mro__):

return True

return NotImplemented

MyIterable.register(Foo)

abc.abstractmethod(function),表明抽象方法的生成器

class classname:

__metaclass__ = ABCMeta

@abstractmethod

def __my_abstract_method__(self):

...

abc.abstractproperty([fget[,fset[,fdel[,doc]]]]),表明一个抽象属性

class classname:

__metaclass__ = ABCMeta

@abstractproperty

def my_abstract_property(self):

...

上例只是只读属性,如果是读写属性,可以如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值