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

Rei*_*ica 4 python methods class decorator

我将直接举例说明:

class Foo:
  @execonce
  def initialize(self):
    print 'Called'

>>> f1 = Foo()
>>> f1.initialize()
Called
>>> f1.initialize()
>>> f2 = Foo()
>>> f2.initialize()
Called
>>> f2.initialize()
>>> 
Run Code Online (Sandbox Code Playgroud)

我试图定义execonce但不能写一个与方法一起使用的.

PS:我无法定义代码,__init__因为initialize必须初始化对象调用.cf - cmdln issue 13

Ale*_*lli 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
Run Code Online (Sandbox Code Playgroud)

  • 我建议添加functools.wraps装饰器来做和做.这样,函数的文档和其他属性将是相同的. (2认同)