欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-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ā)
国产亚洲精品一二三区| 久七久精品视频黄色的| 日韩高清毛片免费观看| 日本人妻免费一区二区三区| 亚洲黄片在线免费小视频| 成在线人免费视频一区二区| 果冻传媒在线观看免费高清| 欧美日韩中黄片免费看| 欧美多人疯狂性战派对| 观看日韩精品在线视频| 91欧美日韩中在线视频| 欧美一级特黄大片做受大屁股| 国产精品亚洲二区三区| 亚洲av首页免费在线观看| 国产午夜在线精品视频| 久热青青草视频在线观看| 色哟哟哟在线观看视频| 美女黄片大全在线观看| 国产永久免费高清在线精品 | 91偷拍视频久久精品| 日韩人妻精品免费一区二区三区| 国产激情一区二区三区不卡| 性感少妇无套内射在线视频| 亚洲少妇人妻一区二区| 国产传媒中文字幕东京热| 国产内射一级二级三级| 五月天六月激情联盟网| 绝望的校花花间淫事2| 不卡在线播放一区二区三区| 亚洲国产中文字幕在线观看| 国产精品视频第一第二区| 久久精品国产第一区二区三区 | 人妻一区二区三区多毛女| 内用黄老外示儒术出处| 久久亚洲午夜精品毛片| 日韩在线中文字幕不卡| 日韩精品区欧美在线一区| 欧美激情床戏一区二区三| 国产精品午夜性色视频| 亚洲清纯一区二区三区| 台湾综合熟女一区二区|