首页 > 编程知识 正文

python抽象基类,python和java抽象类

时间:2023-05-03 16:31:52 阅读:154952 作者:3460

Python的抽象类和接口的区别是什么?

的接口是对象上的一组方法和属性。

在Python中,可以使用抽象基类来定义和实现接口。

使用抽象基类

例如,假设您要使用collections模块的抽象基类。

导入集合

类myset (collections.set ) :

通过

尝试使用它会导致TypeError,因为创建的类不支持集合的预期行为。

MySet () )

跟踪后台(mostrecentcalllast ) :

文件',line 1,in

typeerror : can ' tinstantiateabstractclassmysetwithabstractmethods

__contains__,__iter__,__len__

因此,必须至少实现__contains__,__iter__和__len__ . 让我们使用documentation的这个实现示例。

classlistbasedset (collections.set ) :

“' ' alternatesetimplementationfavoringspaceoverspeed

andnotrequiringthesetelementstobehashable。

''''

def __init__(self,iterable ) :

self.elements=lst=[]

for value in iterable:

if value not in lst:

LST.append(value ) )。

def __iter__(self ) :

返回迭代器(self.elements ) )。

def __contains__(self,value ) :

return value in self.elements

def __len__(self ) :

returnlen(self.elements ) )。

S1=listbasedset(abcdef ) )。

S2=listbasedset('defghi ' ) ) ) ) ) )。

overlap=s1 s2

实现:创建抽象基类

您可以通过将元类设置为abc.ABCMeta并在相关方法中使用abc.abstractmethod装饰来创建自己的抽象基类。 元类可以在__abstractmethods__属性中添加装饰函数,以防止实例化,直到定义它为止。

导入ABC

例如," effable "被定义为可以用单词表示.假设您想定义可以在Python 2中执行的抽象基类:

classeffable (对象) :

__metaclass__=ABC.ABC元

@abc.abstractmethod

def __str__(self ) :

raisenotimplementederror (usersmustdefine _ _ str _ _ tousethisbaseclass ) )。

或者,在Python 3中,元类声明稍有更改。

classeffable(object,metaclass=abc.ABCMeta ) :

@abc.abstractmethod

def __str__(self ) :

raisenotimplementederror (usersmustdefine _ _ str _ _ tousethisbaseclass ) )。

现在,如果尝试在不实现接口的情况下创建可用对象,将会出现以下情况:

classmyeffable(effable ) :

通过

试图实例化它:

MyEffable () )

跟踪后台(mostrecentcalllast ) :

文件',line 1,in

typeerror : can ' tinstantiateabstractclassmyeffablewithabstractmethods _ _ str _ _

被告知我们还没有完成这项工作。

现在,通过提供预期接口,我们将遵守以下内容:

classmyeffable(effable ) :

def __str__(self ) :

返回可扩展!'

可以使用从抽象类派生的类的具体版本。

me=MyEffable ()

是打印(me )

快速!

还可以做其他事情,例如注册实现这些接口的虚拟子类,但我认为这已经超出了这个问题的范围。 但是,这里展示的其他方法需要使用abc模块来调整这个方法。

结论

Abstract Base Class的创建被证明定义了Python自定义对象的接口。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。