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 getTypeError: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