Sie verwenden Dekorateure können (wenn Sie nicht wissen, dass Sie zu PEP-318 beziehen):
def decorator(method):
def decorated_method(self, *args, **kwargs):
# before the method call
if self.busy:
return None
self.busy = True
# the actual method call
result = method(self, *args, **kwargs)
# after the method call
self.busy = False
return result
return decorated_method
class Thing():
def __init__(self):
self.busy = False
@decorator
def func_1(self):
...
@decorator
def func_2(self):
...
Vielleicht möchten Sie functools.wraps
verwenden, wenn Sie möchten, dass die dekorierte Methode der ursprünglichen Methode "gleicht". Die @decorator
ist nur syntaktischer Zucker, können Sie auch das Dekorateur gelten ausdrücklich:
class Thing():
def __init__(self):
self.busy = False
def func_1(self):
...
func_1 = decorator(func_1) # replace "func_1" with the decorated "func_1"
Im Fall, dass Sie es wirklich Sie können zusätzlich eine Klasse verwenden, Dekorateur für alle Methoden anzuwenden:
def decorate_all_methods(cls):
for name, method in cls.__dict__.items():
if name.startswith('_'): # don't decorate private functions
continue
setattr(cls, name, decorator(method))
return cls
@decorate_all_methods
class Thing():
def __init__(self):
self.busy = False
def func_1(self):
...
def func_2(self):
...
Ich frage mich nur, warum möchten Sie das tun? – abccd
@abccd Meinst du, warum er 'self.busy' so benutzen möchte? –
Ja, das ist, was ich meinte – abccd