装饰器标记要执行的方法,即使多次调用也不会超过一次

时间:2009-07-06 20:18:28

标签: python class methods decorator

我将直接举例:

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

3 个答案:

答案 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方法并因此执行。