Można używać dekoratorów (jeśli ich nie znam można odwołać się do PEP-318):
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):
...
Możesz chcieć użyć functools.wraps
, jeśli chcesz, aby udekorowana metoda "wyglądała jak" oryginalna metoda. @decorator
jest po prostu cukier syntaktyczny, można również zastosować dekorator extenso:
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"
W przypadku naprawdę chcesz, aby zastosować go do wszystkich metod można dodatkowo użyć klasy dekoratora:
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):
...
Zastanawiasz się, dlaczego chcesz to zrobić? – abccd
@abccd Czy masz na myśli, dlaczego chciałby użyć 'self.busy' w ten sposób? –
Tak, to właśnie miałem na myśli – abccd