python 装饰器执行顺序
阿神
阿神 2017-04-17 17:38:40
0
2
332
#!/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会有什么差别吗?

阿神
阿神

闭关修行中......

membalas semua(2)
洪涛

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

洪涛

Python ialah persekitaran masa jalan separuh tersusun dan separuh tafsiran. Kod sumber mula-mula disusun menjadi kod bait, dan kemudian kod bait ini dilaksanakan untuk mendapatkan keputusan.

Fungsi diikat semula selepas melepasi penghias, iaitu

f = deco_functionNeedDoc(f)

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

def func(a = []):
    pass

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 fungsi timeit yang dilaksanakan dahulu, tetapi ia tidak mengeluarkan apa-apa, tetapi mengembalikan objek fungsi secara langsung. Contohnya, jika anda menambah:


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

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

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

foo()

Output akan berubah, keluaran I 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. Itu wrapper

anda
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan