欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python中的decorator裝飾器(上)

在理解裝飾器的概念前,我們首先看一下function和inner function在python中的含義。

成都創(chuàng)新互聯(lián)是專業(yè)的瀾滄網(wǎng)站建設(shè)公司,瀾滄接單;提供成都網(wǎng)站設(shè)計、做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行瀾滄網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

function與inner function

  • function:在python中,function就像其他對象一樣,可以當做參數(shù)或返回值。

  • inner function:一個函數(shù)A(inner function)定義在另一個函數(shù)B中。函數(shù)A就叫做inner function。

# 函數(shù)用做參數(shù)
def hello():
    print("hello")
def welcome():
    print("Welcome")
def say_something(func):
    func()
# 函數(shù)add在函數(shù)cal中定義,并且用做返回值
def cal():
	def add(a,b):
		print(a+b)
	return add

注意:此時add不能直接被外界調(diào)用,因此此時內(nèi)部函數(shù)還未定義。但可以通過cal將add的引用返回,用于在將來調(diào)用。

decorator

decorator:封裝了一個函數(shù),并且改變了其行為

裝飾器本質(zhì)上,是將要被裝飾的函數(shù)作為參數(shù),并且返回一個包裹其的、內(nèi)部定義的函數(shù)。如下所示:my_decorator返回了wrapper的引用,用于將在將來執(zhí)行。

def hello():
    print("hello")
def my_decorator(func):
    def wrapper():
        print("before func work")
        func()
        print("after func work")
    return wrapper
hello_d = my_decorator(hello)
hello_d() 
"""
before func work
hello
after func work
"""

hello_d便是經(jīng)過my_decorator裝飾的函數(shù)。我們明顯發(fā)現(xiàn),過程有些復(fù)雜,為了簡化步驟,python提供了@decorator的語法糖。

下面,我們使用@decorator達到同樣的目的。

@my_decorator
def hello():
    print("hello")
def my_decorator(func):
    def wrapper():
        print("before func work")
        func()
        print("after func work")
    return wrapper
hello()#與hello = my_decorator(hello)作用相同
"""
before func work
hello
after func work
"""

在裝飾器中,wrapper的命名可自定義。

@functools.wrap(func)

觀察上面的例子,由于hello被my_decoratorx裝飾過,此時在python shell查看hello的__name__,發(fā)現(xiàn)

這對我們來說,不是有用的信息,為了“正確”顯示,使用@functools.wrap(func)

import functools
@my_decorator
def hello():
    print("hello")
def my_decorator(func):
	@functools.wrap(func)
    def wrapper():
        print("before func work")
        func()
        print("after func work")
    return wrapper

然后便可以達到和裝飾器裝飾前同樣的效果:

帶參數(shù)的decorator以及幾個例子

# do twice
def do_twice(func):
	 @functools.wraps(func)
    def wrapper(*args,**kwargs):
        func(*args,**kwargs)
        func(*args,**kwargs)
    return wrapper
# timer
def timer(func):
    @functools.wraps(func)
    def wrapper_timer(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print(f"Finished {func.__name__} in {run_time:.4f} seconds")
        return value
    return wrapper_timer

@timer
def waste_time(num):
    for _ in range(num):
        sum([i **2 for i in range()])  

waste_time(1000)
# flask check user login
def login_required(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        if g.user is None:
            return redirect(url_for('login',next=request.url))
        return func(*args, **kwargs)
    return wrapper
    
@app.route('/secret')
@login_required
def secret():
    ...

總結(jié)

decorator用于“包裹”一個函數(shù),改變其行為。
在裝飾器的wrapper中并不一定要執(zhí)行該函數(shù),也可以保留函數(shù)的引用,用于插件的注冊。

參考

realpython

網(wǎng)站欄目:python中的decorator裝飾器(上)
分享地址:http://chinadenli.net/article4/dsogjie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、自適應(yīng)網(wǎng)站、云服務(wù)器、外貿(mào)網(wǎng)站建設(shè)、App開發(fā)、網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
日本不卡片一区二区三区| 国产免费人成视频尤物| 偷拍洗澡一区二区三区| 久久精品免费视看国产成人| a久久天堂国产毛片精品| 亚洲一区二区三区三区| 亚洲a级一区二区不卡| 国产又粗又长又大的视频| 亚洲成人久久精品国产| 又大又长又粗又黄国产| 日韩欧美国产精品中文字幕| 亚洲美女国产精品久久| 亚洲高清亚洲欧美一区二区| 在线免费视频你懂的观看| 免费福利午夜在线观看| 国产主播精品福利午夜二区| 熟女中文字幕一区二区三区| 国产av一区二区三区四区五区| 中文人妻精品一区二区三区四区| 国产亚洲欧美日韩国亚语| 日韩精品视频高清在线观看| 在线欧美精品二区三区| 欧美整片精品日韩综合| 国产黄色高清内射熟女视频| 日本中文字幕在线精品| 好吊日视频这里都是精品| 91熟女大屁股偷偷对白| 日韩一区二区三区四区乱码视频| 亚洲天堂精品在线视频| 欧美黑人在线精品极品| 日韩欧美三级中文字幕| 日韩精品视频免费观看| 国产午夜福利片在线观看| 欧美日韩精品一区二区三区不卡| 91亚洲人人在字幕国产| 国产麻豆成人精品区在线观看| 精品推荐国产麻豆剧传媒| 最近日韩在线免费黄片| 99热在线精品视频观看| 亚洲综合香蕉在线视频| 国产主播精品福利午夜二区|