Python Decorator标记一个方法,即使多次调用,也不能执行一次

Python Decorator标记一个方法,即使多次调用,也不能执行一次,python,class,methods,decorator,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.initiali

我将直接进入示例:

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

>>> f1 = Foo()
>>> f1.initialize()
Called
>>> f1.initialize()
>>> f2 = Foo()
>>> f2.initialize()
Called
>>> f2.initialize()
>>> 
我试图定义
execonce
,但无法编写一个与方法一起工作的方法


PS:我无法在
\uuuu init\uuu
中定义代码,因为
初始化
必须在对象初始化后的某个时间调用。cf-

您可以这样做:

class Foo:
  def __init__(self):
    self.initialize_called = False
  def initialize(self):
    if self.initalize_called:
        return
    self.initialize_called = True
    print 'Called'

这是简单易懂的。
\uuuu init\uuuu>函数中需要另一个实例变量和一些代码,但它可以满足您的要求。

尝试类似的方法

def foo():
     try:
             foo.called
     except:
             print "called"
             foo.called = True

方法和函数是对象。您可以在其上添加方法和属性。这对您的案例很有用。如果您想要一个decorator,只需让decorator分配方法,但首先,检查标志。如果找到标志,将返回null方法并执行。

I get
TypeError:donothing()通过从
donothing
方法中删除
self
参数,至少接受1个参数(给定0)
Ok。。我能够做到这一点。我建议在doit和donothing中添加functools.wrapps decorator。这样,文档和函数的其他属性将是相同的。@srid,oops,编辑以删除self@Manuel,是的,让我也编辑一下…这可能不起作用,因为方法(调用decorator的方法)尚未绑定到对象。。对于每个对象,
initialize
将被调用一次。。不是所有对象。我希望避免对代码中的每个类都这样做。。我建议你不要忽视第二个电话。相反,您应该引发一个异常。如果调用方初始化了两次,则表示发生了错误,您应该报告它,而不是默默地忽略它。当然我不知道你的具体问题Stefano我同意。。这对我来说也很奇怪。基本上,测试用例调用这些子命令方法(例如:“svn commit”)如下:
command.do_commit
command.do_update
。每个子命令都必须调用
initialize
方法(参见cmdln第13期)。我不想提出例外情况。。为什么调用方(测试用例)需要知道这样的内部细节?
def foo():
     try:
             foo.called
     except:
             print "called"
             foo.called = True