python中的抽象类,java抽象类和非抽象类的区别
Python的抽象类和接口有什么区别?
接口是对象上的一组方法和属性。
在Python中,可以使用抽象基类来定义和实现接口。
使用抽象基类
例如,假设您想要使用collections模块的抽象基类。
进口托收
类myset (collections.set):
及格
尝试使用它将导致TypeError,因为创建的类不支持集合的预期行为。
MySet())
背景(mostrecentcalllast):
文件中的第1行
typeerror:不能tinstantiataabstractclassmysetwithabstractmethods
__包含__,__iter__,__len__
因此,必须至少实现__contains__、__iter__和__len__。让我们使用这个文档的实现例子。
classlistbasedset(collections . set):
alternateseimplementationfavoringspaceoverspeed
和notrequiringthesetelementstobeshable .
def __init__(self,iterable):
self.elements=lst=[]
对于iterable中的值:
如果值不在列表中:
LST.append(value))。
def __iter__(self):
返回迭代器(self.elements))。
def __contains__(自身,值) :
self.elements中的返回值
def __len__(self):
returnlen(self.elements)).
S1=listbasedset(abcdef).
S2=listbasedset(defghi ))))).
重叠=s1 s2
实现:创建一个抽象基类
您可以通过将元类设置为abc来创建自己的抽象基类。ABCMeta并在相关方法中用abc.abstractmethod修饰它。类可以在__abstractmethods__属性中添加装饰函数,以防止实例化,直到它被定义。
导入ABC
例如,‘高效’被定义为可以用语言表达的东西。假设您想要定义一个可以在Python 2中执行的抽象基类:
可分类(对象):
__元类__=ABC。ABC元
@abc.abstractmethod
def __str__(self):
raisenotimplementederror(usersmustdefine _ _ str _ _ tousethisbaseclass)).
或者,在Python 3中,元类声明略有变化。
class ffable(object,元类=abc。ABCMeta):
@abc.abstractmethod
def __str__(self):
raisenotimplementederror(usersmustdefine _ _ str _ _ tousethisbaseclass)).
现在,如果您尝试在不实现接口的情况下创建可用的对象,将会发生以下情况:
classmyefffable(effable):
及格
尝试实例化它:
MyEffable())
背景(mostrecentcalllast):
文件中的第1行
typeerror:不能使用abstractmethods _ _ str _ _
被告知我们还没有完成工作。
现在,通过提供预期的接口,我们将遵守以下内容:
classmyefffable(effable):
def __str__(self):
返回可扩展!
您可以使用从抽象类派生的类的具体版本。
me=MyEffable()
是打印(我)
快!
还可以做其他的事情,比如注册实现这些接口的虚子类,但我认为这已经超出了这个问题的范围。但是,此处显示的其他方法需要使用abc模块来调整此方法。
结论
抽象基类的创建被证明定义了Python定制对象的接口。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。