装饰器标记方法最多执行一次即使多次调用

4 投票
3 回答
1505 浏览
提问于 2025-04-15 12:43

我直接给个例子:

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答