Как применить декоратор времени Python к методу в классе - PullRequest
3 голосов
/ 20 июля 2011

Я пытаюсь применить декоратор синхронизации, описанный здесь , к методу в классе, а не к автономному методу. Как это сделать?

Я получаю эту ошибку:

TypeError: unbound method wrapper() must be called with SomeClass instance as
first argument (got float instance instead)

1 Ответ

1 голос
/ 21 июля 2011

EDIT

Благодаря вашему комментарию, я думаю, что знаю, в чем проблема. Это не работает:

class A:

    @timings
    @classmethod
    def a(cls, x):
       print(x)

A.a(2)

именно по той причине, что вы сказали. TypeError: необязательный метод wrapper () должен вызываться с экземпляром A в качестве первого аргумента (вместо этого он получает экземпляр int)

Но это так:

class A:

    @classmethod
    @timings
    def a(cls, x):
        print(x)

A.a(2)

Так что порядок имеет значение. Я думаю, что здесь происходит то, что он обманывает способ, которым python обрабатывает связанные методы: когда python смотрит на член a, он должен принять решение:

  1. Сделайте связанный метод
  2. Создать метод класса
  3. Ничего не делать (оставить все как есть)

Если он получает обычную функцию, он выполняет (1), а @timings создает обычную функцию.

Решает ли это проблему?

...