python 装饰器执行顺序
阿神
阿神 2017-04-17 17:38:40
0
2
336
#!/usr/bin/python**加粗文字**
def deco_functionNeedDoc(func):
        if func.__doc__ == None:
                print func,"has no __doc__, it's a bad habit."
        else:
                print func,':',func.__doc__,'.'
        return func

@deco_functionNeedDoc
def f():
        print 'f() Do something'

@deco_functionNeedDoc
def g():
        'I have a __doc__'
        print 'g() Do something'
f()
g()

Actual Result:
<function f at 0x7f31e65d05f0> has no __doc__, it's a bad habit.
<function g at 0x7f31e65d0668> : I have a doc .
f() Do something
g() Do something

Expected Result:
<function f at 0x7f31e65d05f0> has no __doc__, it's a bad habit.
f() Do something
<function g at 0x7f31e65d0668> : I have a doc .
g() Do something
f()和g()被修饰后是如何执行的?

另外一段使用装饰器的代码

#-*- coding: UTF-8 -*-  
import time

def timeit(func):
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print 'used:', end - start
    return wrapper

@timeit
def foo():
    print 'in foo()'

foo()

Actual Result:

in foo()
used: 2.1e-05

这一段使用wrapper方法执行时先执行foo(),再执行wrapper()。
加了wrapper会有什么差别吗?

阿神
阿神

闭关修行中......

모든 응답(2)
洪涛

데코레이터는 "컴파일 시간에" 실행되는 프로그램과 비슷합니다. 원래 함수가 메모리에 로드되기 전에도 함수를 "장식"하므로 먼저 장식된 다음 함수를 실행하는 프로그램이 있습니다. 그렇지 않으면 마지막에 f() 또는 g()를 실행하지 않고 데코레이팅된 함수의 코드를 실행해 볼 수 있습니다.

洪涛

Python은 반컴파일 및 반해석 런타임 환경입니다. 소스 코드는 먼저 바이트코드로 컴파일된 다음 이 바이트코드를 실행하여 결과를 얻습니다.

데코레이터를 통과한 후 함수가 다시 바인딩됩니다. 즉

으아악

따라서 데코레이터는 함수 개체의 일부여야 합니다. 즉, 이 단계는 코드가 컴파일 중에, 즉 바이트코드로 컴파일될 때 "하드 코딩"된다는 것입니다.

으아악

모두 편집 단계에서 결정됩니다. 따라서 코드가 명확하게 설명됩니다. 컴파일 단계에서는 데코레이터가 먼저 실행되어 함수를 다시 바인딩한 다음 실행 단계에서 f의 항목이 직접 실행됩니다.
PS: 데코레이터의 예는 일반적이지 않습니다. 원래 기능을 래핑하는 일부를 찾을 수 있습니다.
위는 개인적인 이해이므로 함께 논의해 보겠습니다.


수정된 wrap 데코레이터 함수는 사실 가장 먼저 실행되는 timeit 함수인데, 아무것도 출력하지 않고 바로 함수 객체를 반환합니다. 예를 들어 다음을 추가하면

으아악

출력이 변경됩니다. 먼저 I am timeit을 출력합니다. 위에서 말한 내용을 보면 데코레이터가 함수를 다시 바인딩하고 다른 함수를 반환합니다. 컴파일 중에 완료되며, 다시 실행하면 새로운 함수가 바로 실행됩니다. 그게 바로 당신의 wrapper

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿