Перехватывать вызовы методов в Python - PullRequest
38 голосов
/ 24 апреля 2010

Я реализую веб-сервис RESTful на python и хотел бы добавить некоторые функции ведения журнала QOS, перехватывая вызовы функций и регистрируя время их выполнения и т. Д.

По сути, я подумал о классе, от которого могут наследоваться все другие сервисы, который автоматически переопределяет реализации метода по умолчанию и упаковывает их в функцию логгера. Какой лучший способ достичь этого?

Ответы [ 2 ]

49 голосов
/ 24 апреля 2010

Как то так? Это подразумевает добавление декоратора к вашему методу (вы также можете сделать явный декоратор на основе этого, если вы предпочитаете):

class Foo(object):
    def __getattribute__(self,name):
        attr = object.__getattribute__(self, name)
        if hasattr(attr, '__call__'):
            def newfunc(*args, **kwargs):
                print('before calling %s' %attr.__name__)
                result = attr(*args, **kwargs)
                print('done calling %s' %attr.__name__)
                return result
            return newfunc
        else:
            return attr

когда вы сейчас попробуете что-то вроде:

class Bar(Foo):
    def myFunc(self, data):
        print("myFunc: %s"% data)

bar = Bar()
bar.myFunc(5)

Вы получите:

before calling myFunc
myFunc:  5
done calling myFunc
5 голосов
/ 24 апреля 2010

Что если вы напишите декоратор для каждой функции? Вот пример на вики Python .

Используете ли вы какой-либо веб-фреймворк для веб-сервиса? Или ты все делаешь вручную?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...