我将直接进入示例:

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__ 中定义代码,因为 initialize 必须在对象初始化后的某个时间调用。 cf - cmdln issue 13

最佳答案

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

关于python - 装饰器将方法标记为即使多次调用也不会执行超过一次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1089023/

10-12 21:09