擅长:python、mysql、java
<p>乍一看,为了解决这个问题,这可能更复杂</p>
<ol>
<li>装饰器未绑定到类的实例</li>
<li>此装饰器与类耦合</li>
</ol>
<p>我将使装饰器参数化,并将其移出课堂。然后,可以将专门用于特定预调用方法的decorator实例分配给类变量。然后这个类变量可以用作实际的装饰器</p>
<pre><code>def precall_decorator(precall_f):
def decor(f):
def inner(self, *args, **kwargs):
precall_f(self)
return f(self, *args, **kwargs)
return inner
return decor
class Session:
def __init__(self, ts):
self.tempo_throttlers = [TempoThrottler(t) for t in ts]
...
def _wait_on_throttlers(self):
for th in self.tempo_throttlers:
if not th.isallowed():
time.sleep(th.mustwait())
th.consume()
...
_throttled = precall_decorator(_wait_on_throttlers)
@_throttled
def request1(self):
...
@_throttled
def request2(self):
...
</code></pre>