#!/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会有什么差别吗?
데코레이터는 "컴파일 시간에" 실행되는 프로그램과 비슷합니다. 원래 함수가 메모리에 로드되기 전에도 함수를 "장식"하므로 먼저 장식된 다음 함수를 실행하는 프로그램이 있습니다. 그렇지 않으면 마지막에 f() 또는 g()를 실행하지 않고 데코레이팅된 함수의 코드를 실행해 볼 수 있습니다.
데코레이터를 통과한 후 함수가 다시 바인딩됩니다. 즉
으아악따라서 데코레이터는 함수 개체의 일부여야 합니다. 즉, 이 단계는 코드가 컴파일 중에, 즉 바이트코드로 컴파일될 때 "하드 코딩"된다는 것입니다.
으아악모두 편집 단계에서 결정됩니다. 따라서 코드가 명확하게 설명됩니다. 컴파일 단계에서는 데코레이터가 먼저 실행되어 함수를 다시 바인딩한 다음 실행 단계에서 f의 항목이 직접 실행됩니다.
PS: 데코레이터의 예는 일반적이지 않습니다. 원래 기능을 래핑하는 일부를 찾을 수 있습니다.
위는 개인적인 이해이므로 함께 논의해 보겠습니다.
수정된
으아악wrap
데코레이터 함수는 사실 가장 먼저 실행되는timeit
함수인데, 아무것도 출력하지 않고 바로 함수 객체를 반환합니다. 예를 들어 다음을 추가하면출력이 변경됩니다. 먼저
I am timeit
을 출력합니다. 위에서 말한 내용을 보면 데코레이터가 함수를 다시 바인딩하고 다른 함수를 반환합니다. 컴파일 중에 완료되며, 다시 실행하면 새로운 함수가 바로 실행됩니다. 그게 바로 당신의wrapper