<h3>在<code>isinstance()</code>或接口</h3>
<p>通常,您需要用对象定义要<em>做什么</em>,然后使用多态性来调整每个对象对您要做的事情的响应方式,或者使用duck类型;首先测试手头的对象是否可以做您想做的事情。这是调用与内省的权衡,传统的观点认为调用优于内省,但是在Python中,duck类型比<code>isinstance</code>测试更可取。在</p>
<p>所以你需要弄清楚为什么首先你需要过滤掉一些东西是不是可以接受的,为什么你需要知道这个?只需使用<code>try: iter(object)</code>,<code>except TypeError: # not iterable</code>来测试。在</p>
<p>或者,如果传递的内容不是iterable,那么您可能只需要抛出一个异常,因为这将意味着一个错误。在</p>
<h3>ABCs</h3>
<p>使用duck类型,您可能会发现您必须测试多个方法,因此<code>isinstance()</code>测试可能是一个更好的选择。在这种情况下,使用<a href="http://docs.python.org/2/library/abc.html" rel="noreferrer">Abstract Base Class (ABC)</a>也可以是一种选择;例如,使用ABC让您将几个不同的类“绘制”为给定操作的正确类型。使用ABC让您将注意力集中在需要执行的任务上,而不是使用特定的实现;您可以使用<code>Paintable</code>ABC、<code>Printable</code>ABC等</p>
<h3>Zope接口和组件架构</h3>
<p>如果您发现您的应用程序使用了大量的abc,或者您不得不向类中添加多态方法来处理各种不同的情况,那么下一步就是考虑使用一个完整的组件体系结构,比如<a href="http://www.muthukadan.net/docs/zca.html" rel="noreferrer">Zope Component Architecture (ZCA)</a>。在</p>
<p><code>zope.interface</code>接口是甾体上的abc,尤其是与ZCA适配器结合时。接口记录类的预期行为:</p>
<pre><code>if IFrobnarIterable.providedBy(yourobject):
# it'll support iteration and yield Frobnars.
</code></pre>
<p>但是它也让您可以查找适配器;您不必在类中为每次使用形状而设置所有行为,而是实现适配器来为特定的用例提供多态行为。您可以将对象调整为可打印、可编辑或可导出为XML:</p>
^{pr2}$
<p>代码只需为每个形状查找适配器:</p>
<pre><code>for obj in setofobjects:
self.result.append(IXMLExport(obj).export())
</code></pre>