C? instance_method , , function? instance_method ?
called=[] , - function. , decorator , function?
c=C()
d=D()
c.function()
d.function()
c.instance_method d.instance_method. , , , .
self._instance_method_called , self.instance_method. C instance_method .
If you want to be instance_methodcalled no more than once, no matter which instance Cinvokes function, simply define it _instance_method_calledas a class attribute instead of an instance attribute.
def decorator():
print('Locals in decorator %s ' % locals())
def wrap(f):
def wrapped(self,*args):
print('Locals in wrapper %s' % locals())
if not self._instance_method_called:
self.instance_method()
self._instance_method_called=True
return f
return wrapped
return wrap
class C:
def __init__(self):
self._instance_method_called=False
def instance_method(self): print('Method called')
@decorator()
def function(self):
pass
c = C()
c.function()
c.function()
d = C()
d.function()
d.function()
Edit: To get rid of the instructions if:
def decorator():
print('Locals in decorator %s ' % locals())
def wrap(f):
def rest(self,*args):
print('Locals in wrapper %s' % locals())
return f
def first(self,*args):
print('Locals in wrapper %s' % locals())
self.instance_method()
setattr(self.__class__,f.func_name,rest)
return f
return first
return wrap
class C:
def instance_method(self): print('Method called')
@decorator()
def function(self):
pass
source
share