装饰器标记方法最多执行一次即使多次调用
我直接给个例子:
class Foo:
@execonce
def initialize(self):
print 'Called'
>>> f1 = Foo()
>>> f1.initialize()
Called
>>> f1.initialize()
>>> f2 = Foo()
>>> f2.initialize()
Called
>>> f2.initialize()
>>>
我尝试定义一个叫 execonce
的东西,但没办法写出一个能和方法一起工作的。
补充说明:我不能在 __init__
里定义这个,因为 initialize
必须在对象初始化后 某个时候 被调用。可以参考 - cmdln 问题 13
3 个回答
0
试试类似这样的做法
def foo():
try:
foo.called
except:
print "called"
foo.called = True
方法和函数其实都是对象。你可以在它们上面添加方法和属性。这对你的情况可能会很有帮助。如果你想要一个装饰器(decorator),只需要让这个装饰器分配方法,但首先要检查一个标志。如果这个标志存在,就返回一个空的方法,然后执行这个空的方法。
0
你可以这样做:
class Foo:
def __init__(self):
self.initialize_called = False
def initialize(self):
if self.initalize_called:
return
self.initialize_called = True
print 'Called'
这个方法简单明了,容易理解。在这个方法中,还需要在__init__
函数里添加一个实例变量和一些代码,但这样做可以满足你的需求。
6
import functools
def execonce(f):
@functools.wraps(f)
def donothing(*a, **k):
pass
@functools.wraps(f)
def doit(self, *a, **k):
try:
return f(self, *a, **k)
finally:
setattr(self, f.__name__, donothing)
return doit
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。