擅长:python、mysql、java
<p>如果这是针对Python 2.x或Python 3.2+,也可以使用<code>callable()</code>。它以前是不推荐的,但现在是不推荐的,所以您可以再次使用它。你可以在这里阅读讨论:<a href="http://bugs.python.org/issue10518" rel="noreferrer">http://bugs.python.org/issue10518</a>。你可以通过以下方法来实现:</p>
<pre><code>callable(obj)
</code></pre>
<p>如果这是针对Python 3.x但在3.2之前的版本,请检查对象是否具有<code>__call__</code>属性。你可以通过以下方法来实现:</p>
<pre><code>hasattr(obj, '__call__')
</code></pre>
<p>通常建议的<code>types.FunctionTypes</code>方法是不正确的,因为它无法覆盖许多您可能希望它通过的情况,比如内置:</p>
<pre><code>>>> isinstance(open, types.FunctionType)
False
>>> callable(open)
True
</code></pre>
<p>检查duck类型对象的属性的正确方法是询问它们是否嘎嘎作响,而不是查看它们是否适合放在duck大小的容器中。不要使用<code>types.FunctionType</code>,除非你对什么是功能有一个非常明确的概念。</p>