我将直接举例:
class Foo:
@execonce
def initialize(self):
print 'Called'
>>> f1 = Foo()
>>> f1.initialize()
Called
>>> f1.initialize()
>>> f2 = Foo()
>>> f2.initialize()
Called
>>> f2.initialize()
>>>
我尝试定义execonce
但无法编写适用于方法的文件。
PS:我无法在__init__
中定义代码,{/ 1}}必须在初始化对象后的某个时间调用。 cf - cmdln issue 13
答案 0 :(得分: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
答案 1 :(得分:0)
你可以这样做:
class Foo:
def __init__(self):
self.initialize_called = False
def initialize(self):
if self.initalize_called:
return
self.initialize_called = True
print 'Called'
这很简单易读。 <{1}}函数中还有另一个实例变量和一些代码,但它可以满足您的要求。
答案 2 :(得分:0)
尝试与此相似的内容
def foo():
try:
foo.called
except:
print "called"
foo.called = True
方法和功能是对象。您可以在它们上添加方法和属性。这对您的情况很有用。如果你想要一个装饰器,只需让装饰器分配方法,但首先检查标志。如果找到该标志,则返回null方法并因此执行。