Обозначение класса с помощью decorator
означает, что Class_test
теперь является decorator
объектом, так что Class_test.function
- это класс, для которого вы написали тело.
Помните, что синтаксис @decorator
является синтаксическим сахаром для
class Class_test(object):
def __init__(self):
pass
def sum_func(self, a, b):
print('class sum: %s' % (a+b))
return a+b
Class_test = decorator(Class_test)
(за исключением того, что символ Class_test
ни в коем случае не относится к вашему классу).
Таким образом, этот decorator
объект вызывается, когда вы вызываете Class_test
, и это именно то, что вы видите в своем журнале:
sth to log: Class_test : ()
func.sum_func
, с другой стороны, является методом регулярных границ. Он ничего не знает о decorator
.
Если вы собираетесь использовать его внутри классов, я бы предпочел декоратор в стиле замыкания (функция, которая возвращает функцию). Функция, которую она возвращает, будет зарегистрирована методом, обычно с помощью механизма class
.
from functools import wraps
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print('sth to log: %s : %s' % (func.__name__, args))
return func(*args, **kwargs)
return wrapper
class Class_test(object):
@decorator
def sum_func(self, a, b):
print('class sum: %s' % (a+b))
return a+b
Если вы все еще хотите использовать подход на основе классов, прочитайте Python Class Based Decorator с параметрами, которые могут украшать метод или функцию