Элемент Decorator и error() аргумент 1 должен быть кодом, а не str

У меня следующий код

def timer_dec(f):
    def wrapper(*args, **kwargs):
        t = time.time()
        args[0].debug('<{}> start'.format(f.__name__))
        res = f(*args, **kwargs)
        args[0].debug('<{}> finish'.format(f.__name__))
        args[0].debug("Working time for function <%s>: %f" % (f.__name__, time.time() - t))
        return  res

    return wrapper

Это прекрасно работает:

@timer_dec
class A(object):
  pass

Но это не работает:

@timer_dec
class A(object):
  pass

class B(A):
  pass

TypeError: Ошибка при вызове функции базы данных baseas() аргумент 1 должен быть кодом, а не str

Версия для Python - 2,7

+1
источник поделиться
2 ответа

Кажется, вы используете декоратор функций в качестве декоратора класса.

@timer_dec
class A(object):
  pass

эквивалентно

class A(object):
  pass
A = timer_dec(A)

Поскольку timer_dec возвращает функцию, A теперь является функцией.


Вы можете создать декоратор класса, который применяет декоратор функций ко всем методам класса. См. Здесь пример: Алекс Мартелли отвечает на применение декораторов python методам в классе

+3
источник

Ваш декоратор возвращает функцию. Таким образом, после вызова декоратора имя "A" связано с функцией, а не с классом. Затем вы пытаетесь наследовать B от функции A, которая является незаконной.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос