栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在python中,有没有一种方法可以在将对象传递给函数之前知道它是否“实现了接口”?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在python中,有没有一种方法可以在将对象传递给函数之前知道它是否“实现了接口”?

isinstance()
or接口之前使用多态和鸭式输入

你通常定义要怎样 你的对象,那么无论使用多态,怎么每个对象响应调整到你想要做什么,或者你用鸭打字;
首先测试对象是否可以做您想做的事情。这是调用与内省之间的权衡,传统观点认为,调用比自省要好,但是在Python中,鸭子类型胜于

isinstance
测试。

因此,您需要弄清楚 为什么 首先需要过滤或不过滤某些东西。你为什么需要知道这个?只需使用一个

try: iter(object)
exceptTypeError: # not iterable
来测试。

或者,如果传递的内容不是可迭代的,则可能只需要引发异常,因为这将表明错误。

美国广播公司

使用鸭式输入法,您可能会发现必须测试多种方法,因此

isinstance()
测试可能是更好的选择。在这种情况下,也可以选择使用抽象基类(ABC)。例如,使用ABC,您可以将几种不同的类“绘制”为给定操作的正确类型。使用ABC,您可以专注于需要执行的任务,而不是所使用的特定实现。您可以拥有
Paintable
ABC,
Printable
ABC等。

Zope接口和组件架构

如果你发现你的应用程序正在使用的 可怕的
很多基本知识,或者你一直有一个多态的方法来你的类添加应对各种不同的情况,下一步就是如考虑使用全面的组件体系结构,Zope的组件架构(ZCA)。

zope.interface
接口是类固醇上的ABC,尤其是与ZCA适配器结合使用时。接口记录了类的预期行为:

if IFrobnarIterable.providedBy(yourobject):    # it'll support iteration and yield Frobnars.

但它也让您查找适配器;您可以实现适配器来为特定用例提供多态行为,而不是将类的每次使用的所有行为都放入类中。您可以将对象调整为可打印,可迭代或可导出为XML:

class FrobnarsXMLExport(object):    adapts(IFrobnarIterable)    provides(IXMLExport)    def __init__(self, frobnariterator):        self.frobnars = frobnariterator    def export(self):        entries = []        for frobnar in self.frobnars: entries.append(     u'<frobnar><width>{0}</width><height>{0}</height></frobnar>'.format(         frobnar.width, frobnar.height)        return u''.join(entries)

而且您的代码只需查找每种形状的适配器:

for obj in setofobjects:    self.result.append(IXMLExport(obj).export())


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/661817.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号