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自定义对象的接口。