Python中的Java抽象接口设计

Python中的Java抽象接口设计,第1张

Python中的Java抽象/接口设计

Python接口背后有一个故事。多年来一直保持主导地位的原始态度是您不需要它们:Python在EAFP(更容易要求宽恕而不是允许)原则上工作。也就是说,无需指定接受一个I​​Closeno
ICloseable对象,而是

close
在需要时尝试尝试该对象,如果它引发异常,则引发异常。

因此,以这种心态,您只需单独编写类,然后按需使用即可。如果其中之一不符合要求,则您的程序将引发异常。相反,如果您使用正确的方法编写另一个类,则它将正常工作,而无需指定它实现您的特定接口。

这很好用,但是有明确的接口用例,尤其是在大型软件项目中。Python的最终决定是提供该

abc
模块,该模块允许您编写
抽象基类, 即除非您重写其所有方法,否则无法实例化的类。您是否应该使用它们是您的决定。

引入ABC的PEP解释比我能做的更好:

在面向对象编程领域,与对象交互的使用模式可以分为两个基本类别,即“调用”和“检查”。

调用是指通过调用对象的方法与对象进行交互。通常,这与多态性结合在一起,因此,调用给定方法可能会根据对象的类型运行不同的代码。

检查是指外部代码(在对象的方法之外)检查该对象的类型或属性,并根据该信息来决定如何处理该对象的能力。

两种使用模式均服务于相同的通用目的,即能够以统一的方式支持处理多种多样且可能新颖的对象,但同时允许为每种不同类型的对象定制处理决策。

在经典的OOP理论中,调用是首选的使用模式,并且不鼓励检查,因为检查被认为是较早的过程编程风格的产物。但是,实际上,这种观点过于教条和僵化,并导致一种设计僵化,与诸如Python之类的语言的动态特性大相径庭。

特别是,通常需要以对象类的创建者无法预期的方式处理对象。内置到满足该对象的每个可能用户需求的每个对象方法中,并非总是最佳的解决方案。此外,有许多强大的调度哲学与经典的OOP行为(严格地封装在一个对象中)形成了鲜明的对比,行为是规则或模式匹配驱动的逻辑。

另一方面,经典的OOP理论家对检查的批评之一是缺乏形式主义和所检查内容的特殊性质。在诸如Python这样的语言中,几乎可以通过外部代码反映并直接访问对象的任何方面,有很多不同的方法来测试对象是否符合特定的协议。例如,如果询问“此对象是可变序列容器吗?”,则可以寻找“列表”的基类,或者可以寻找名为“
getitem”的方法。但请注意,尽管这些测试看似显而易见,但它们都不是正确的,因为其中一个会产生假阴性,而另一个会产生假阳性。

普遍同意的补救措施是对测试进行标准化,并将其分组为正式形式。通过继承机制或其他某种方式,通过与每个类关联一组标准的可测试属性,最容易做到这一点。每个测试都带有一组诺言:它包含有关类的一般行为的诺言,以及关于其他可用的类方法的诺言。

该PEP为组织这些测试提出了一种特殊的策略,称为抽象基类(ABC)。ABC只是添加到对象继承树中的Python类,以将对象的某些功能发送给外部检查器。使用isinstance()完成测试,并且特定ABC的存在意味着测试已通过。

此外,ABC定义了建立类型特征行为的最少方法集。根据对象的ABC类型区分对象的代码可以相信,这些方法将始终存在。这些方法中的每一个都附带有通用的抽象语义定义,该定义在ABC的文档中进行了描述。这些标准的语义定义不是强制性的,但强烈建议使用。

像Python中的所有其他内容一样,这些承诺属于绅士协议的性质,在这种情况下,这意味着尽管该语言确实执行了ABC中做出的某些承诺,但具体类的实现者必须确保其余的保留下来。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5561075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存