<p>这是您的代码,经过清理,可以删除类似Java的getter/setter,这在Python中是不必要的:</p>
<pre><code>import time
class MyClass():
def __init__(self):
self.last_use = 0
def Foo(self):
elapsed = time.time() - self.last_use
if elapsed < 5:
print("Wait 5 seconds")
return
self.last_use = time.time()
print("Let's Foo!")
mc = MyClass()
mc.Foo()
mc.Foo()
mc.Foo()
mc.Foo()
print('wait a bit now...')
time.sleep(5)
mc.Foo()
</code></pre>
<p>您遇到的主要语法错误是在if语句中省略了“:”。逻辑上,你的<code>> 5</code>应该是<code>< 5</code>。你知道吗</p>
<p>这张照片:</p>
<pre><code>Let's Foo!
Wait 5 seconds
Wait 5 seconds
Wait 5 seconds
wait a bit now...
Let's Foo!
</code></pre>
<p>编辑:
这里是高级版本,其中<code>wait_at_least</code>装饰器
注意检查通话间隔时间的开销逻辑,以及
各种<code>FooX()</code>方法只做<code>FooX()</code>方法所做的:</p>
<pre><code>def wait_at_least(min_wait_time):
"a decorator to check if a minimum time has elapsed between calls"
def _inner(fn):
# a wrapper to define the last_call value to be preserved
# across function calls
last_call = [0]
def _inner2(*args, **kwargs):
# the function that will actually be called, checking the
# elapsed time and only calling the function if enough time
# has passed
elapsed = time.time() - last_call[0]
if elapsed < min_wait_time:
msg = "must wait {:.2f} seconds before calling {} again".format(min_wait_time - elapsed, fn.__name__)
print(msg)
# consider doing 'raise NotYetException(msg, min_wait_time, elapsed)`
# instead of just returning
return
last_call[0] = time.time()
return fn(*args, **kwargs)
return _inner2
return _inner
class MyClass():
def __init__(self):
pass
@wait_at_least(5)
def Foo(self):
print("Let's Foo!")
@wait_at_least(3)
def Foo2(self):
print("We can Foo2!")
mc = MyClass()
mc.Foo()
mc.Foo2()
mc.Foo()
mc.Foo2()
time.sleep(1.5)
mc.Foo()
mc.Foo2()
print('wait a bit now...')
time.sleep(3)
mc.Foo()
mc.Foo2()
print('wait a little bit more...')
time.sleep(2)
mc.Foo()
mc.Foo2()
</code></pre>
<p>我添加了Foo2来说明这两个方法保持独立的计时器,并且可以在调用之间采用不同的最小等待时间。你知道吗</p>
<p>印刷品:</p>
<pre><code>Let's Foo!
We can Foo2!
must wait 5.00 seconds before calling Foo again
must wait 3.00 seconds before calling Foo2 again
must wait 3.50 seconds before calling Foo again
must wait 1.50 seconds before calling Foo2 again
wait a bit now...
must wait 0.50 seconds before calling Foo again
We can Foo2!
wait a little bit more...
Let's Foo!
must wait 1.00 seconds before calling Foo2 again
</code></pre>