Выбранный ответ действителен практически во всех случаях. Однако при проверке, связан ли метод в декораторе с использованием выбранного ответа, проверка завершится неудачно. Рассмотрим этот пример декоратора и метод:
def my_decorator(*decorator_args, **decorator_kwargs):
def decorate(f):
print(hasattr(f, '__self__'))
@wraps(f)
def wrap(*args, **kwargs):
return f(*args, **kwargs)
return wrap
return decorate
class test_class(object):
@my_decorator()
def test_method(self, *some_params):
pass
Оператор print
в декораторе выведет False
.
В этом случае я не могу найти какой-либо другой способ, кроме как проверить параметры функции, используя их имена аргументов и найти один с именем self
. Это также не гарантирует безупречную работу, поскольку первый аргумент метода не обязательно должен называться self
и может иметь любое другое имя.
import inspect
def is_bounded(function):
params = inspect.signature(function).parameters
return params.get('self', None) is not None