<p><em>为了补充Paul的回答,您可以定义一个类聚合类似缓存的方法,然后(重新)使用这些方法作为装饰器。你知道吗</p>
<pre><code>import functools as ft #< used to keep meth-related docstring
class Cache(object):
def __init__(self):
self._cache = {}
@classmethod
def _property(cls, meth):
@property
@ft.wraps(meth)
def __property(cls):
meth_name = meth.__name__
if meth_name not in cls._cache:
cls._cache[meth_name] = meth(cls)
return cls._cache[meth_name]
return __property
@classmethod
def _method(cls, meth):
@ft.wraps(meth)
def __method(cls, *args, **kwargs):
meth_key = '{}_{}'.format(meth.__name__, args)# < considered as string so as avoid unhashable-type errors
if meth_key not in cls._cache:
cls._cache[meth_key] = meth(cls, *args, **kwargs)
return cls._cache[meth_key]
return __method
</code></pre>
<p>然后使用类<code>Cache</code>作为<code>Minimization</code>的祖先,如下所示</p>
<pre><code>import numpy as np
from scipy.optimize import minimize
class Minimization(Cache):#< Inherits of Cache instead of object
'''A class to optimizae a function'''
def __init__(self,x,y):
super(Minimization,self).__init__()
self.x0 = x # I changed the names because as it stands,
self.y0 = y # these attributes are actually used as first guesses
self.p0 = np.array([x,y]) # for the resolution process
@Cache._method
def g(self, x, y):
return x - y
#@Cache._method
def f(self,p):
return (self.g(*p) - 1)**2
#@Cache._method
def df(self,p):
fprime = 2*(self.g(*p) - 1)
return np.array([fprime,-fprime])
@Cache._property
def optimized(self):#< - I changed the name into optimized to make it representative of what it is, a property
return minimize(fun=self.f, x0=self.p0, args=(), method='Newton-CG',jac=self.df)
</code></pre>
<p>用例(在Python 2.7.11和3.6.1下测试)</em></p>
<pre><code>>>> m = Minimization(2,4)
>>> # Take care to clear the cache if optimized is not called for the first time and that you changed one of its "dependencies", doing m._cache.clear().
>>> # something you may want to do is simply removing the @Cache._property decorator
>>> m.optimized
status: 0
success: True
njev: 6
nfev: 3
fun: 0.0
x: array([ 3.5, 2.5])
message: 'Optimization terminated successfully.'
nhev: 0
jac: array([ 0., -0.])
</code></pre>