#!/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会有什么差别吗?
Penghias lebih seperti program yang dilaksanakan "pada masa penyusunan". Jika tidak, anda boleh cuba melaksanakan kod dalam fungsi yang dihias tanpa melaksanakan f() atau g() pada penghujung
Fungsi diikat semula selepas melepasi penghias, iaitu
Jadi penghias harus menjadi sebahagian daripada objek fungsi Dalam erti kata lain, langkah ini ialah kod "dikodkan keras" semasa penyusunan, iaitu, apabila ia disusun menjadi kod bait Ini serupa dengan parameter lalai daripada fungsi
Semuanya ditentukan semasa peringkat kompilasi. Jadi, kod anda pasti dijelaskan Dalam fasa penyusunan, penghias mula-mula dilaksanakan untuk mengikat semula fungsi, dan kemudian dalam fasa pelaksanaan, perkara dalam f dijalankan secara langsung.
PS: Contoh penghias anda tidak tipikal Anda boleh menemui beberapa yang membungkus fungsi asal
Di atas adalah pemahaman peribadi saya, mari kita bincangkan bersama
Fungsi penghias
wrap
yang diubah suai sebenarnya ialah fungsitimeit
yang dilaksanakan dahulu, tetapi ia tidak mengeluarkan apa-apa, tetapi mengembalikan objek fungsi secara langsung. Contohnya, jika anda menambah:Output akan berubah, keluaran
andaI am timeit
pertama Lihat apa yang saya katakan di atas, penghias mengikat semula fungsi dan mengembalikan fungsi lain. Ia selesai semasa penyusunan, dan apabila dilaksanakan semula, fungsi baharu akan dilaksanakan secara langsung. Ituwrapper