擅长:python、mysql、java
<p>一旦你开始需要函数的属性,就把它变成一个<em><a href="http://en.wikipedia.org/wiki/Function_object" rel="nofollow">functor</a></em>:</p>
<pre><code>class MainFactory(object):
def __call__(self):
self.x = 4
main = MainFactory() # Create the function-like object main
main() # call it
print main.x # inspect internal attributes
</code></pre>
<p>python中的函子只是一个普通对象,其类实现了特殊的<code>__call__</code>方法。它还可以有一个<code>__init__</code>方法,在这个方法中,您可以根据需要预先设置属性的值。然后,通过在实例化时提供不同的参数,可以创建不同的functor“风格”:</p>
<pre><code>class MainFactory(object):
def __init__(self, parameter=1):
self.parameter = parameter
def __call__(self):
self.x = 4 * self.parameter
</code></pre>
<p>现在<code>main = MainFactory(2); main()</code>将<code>main.x</code>设置为8。你知道吗</p>
<p>显然,您可以通过简单地使用局部变量而不是<code>self</code>的属性来保持函数中不重要的变量不可访问:</p>
<pre><code> def __call__(self):
# i and p are not accessible from outside, self.x is
for i in range(10):
p = i ** self.parameter
self.x += p
</code></pre>