0
0 комментариев

Изучаю Python. Написал такой код:

logger.py:

import time
 
def log(foo):
    def tmp(*args, **kwargs):
        print "Запуск функции %s" % foo.func_name
        res = foo(*args, **kwargs)
        return res
    return tmp
 
def timer(foo):
    def tmp(*args, **kwargs):
        t = time.time()
        res = foo(*args, **kwargs)
        print "Время выполнения функции: %f" % (time.time()-t)
        return res
    return tmp

test.py:

import logger
 
class Test():
    <a href="/users/5989/login8"><a href="/users/5989/login8">@log</a></a>ger.log
    <a href="/users/5989/login8"><a href="/users/5989/login8">@log</a></a>ger.timer
    def __init__(self):
        pass
 
    <a href="/users/5989/login8"><a href="/users/5989/login8">@log</a></a>ger.log
    <a href="/users/5989/login8"><a href="/users/5989/login8">@log</a></a>ger.timer
    def __del__(self):
        pass
 
a = Test()
a = None
print 'Окончание программы'

Выводит:

Запуск функции tmp
Время выполнения функции: 0.000013
Запуск функции tmp
Время выполнения функции: 0.000005
Окончание программы

Как видно, декоратор log обращается к декоратору по цепочке, а не к целевой функции. Можно попробовать решить это сменой @log @timer на @timer @log, но тогда отображается некорректное время выполнения целевых методов, да и с точки зрения самого изучения процесса, как обратиться непосредственно к __init__ из первого декоратора в цепочке?


Добавить комментарий