<p>如果我是你,我会提供两种不同的功能:</p>
<ol>
<li><code>mymodule.Parser().parseFile()</code>(实例方法),和</li>
<li><code>mymodule.parseFile()</code>(使用默认实例的模块级函数)。你知道吗</li>
</ol>
<p>例如,标准<a href="https://docs.python.org/3/library/json.html">^{<cd3>}</a>模块就是这样,其中有<code>json.JSONDecoder().decode()</code>和<code>json.loads()</code>。提供两个不同的函数使代码不那么模棱两可,更显式,更可预测(在我看来)。你知道吗</p>
<p>然而,是的:你想做的是可能的。您必须使用<code>__get__</code>实现自己的<a href="https://docs.python.org/3/howto/descriptor.html">descriptor</a>。举个例子:</p>
<pre><code>from functools import partial
class class_and_instance_method(object):
def __init__(self, func):
self.func = func
def __get__(self, obj, type=None):
first_arg = obj if obj is not None else type
return partial(self.func, first_arg)
class Parser(object):
@class_and_instance_method
def parseFile(self):
if isinstance(self, type):
print('using default parser')
else:
print('using the current instance')
</code></pre>
<p/>
<pre><code>>>> Parser.parseFile()
using default parser
</code></pre>
<p/>
<pre><code>>>> p = Parser()
>>> p.parseFile()
using the current instance
</code></pre>