最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你了解Python中的裝飾器

 更新時間:2022年03月31日 08:32:13   作者:宇宙之一粟  
Python中的裝飾器是你進入Python大門的一道坎,不管你跨不跨過去它都在那里,下面這篇文章主要給大家介紹了關于Python中裝飾器的相關資料,需要的朋友可以參考下

前言

本文將帶你學習裝飾器在 Python 中的工作原理,如果在函數(shù)和類中使用裝飾器,如何利用裝飾器避免代碼重復(DRY 原則,Don’t Repeat Yourself )。

Python 中的裝飾器是什么

裝飾器在 Python中是一個非常強大和有用的工具,因為它允許程序員修改函數(shù)或類的行為。裝飾器允許我們包裝另一個函數(shù),以擴展包裝函數(shù)的行為,而無需修改基礎函數(shù)定義。這也被稱為元編程,因為程序本身在程序運行時會嘗試修改自身的另一部分。

裝飾器是?語法糖: ?在代碼中利用更簡潔流暢的語法實現(xiàn)更為復雜的功能。

我們知道,Python 一切皆對象。這意味著 Python 中的函數(shù)可以用作參數(shù)或作為參數(shù)傳遞。一等函數(shù)的屬性:

  • 函數(shù)是 Object 類型的實例。
  • 可以將函數(shù)存儲在變量中。
  • 可以將該函數(shù)作為參數(shù)傳遞給另一個函數(shù)。
  • 可以從函數(shù)中返回函數(shù)。
  • 可以將它們存儲在數(shù)據(jù)結構中,例如哈希表,列表等。

讓我們看一個這樣的例子。

def hello():
    print('Welcome to Python Decorator!')
another_hello = hello()
another_hello
# Welcome to Python Decorator!

定義了一個 ??hello()?? 函數(shù),然后將 hello 函數(shù)分配給 another_hello 變量,然后調(diào)用這個變量,得到的結果是 hello 函數(shù)被執(zhí)行。

既然 Python 中的函數(shù)是對象,那么除了可以簡單的調(diào)用之外,就可以把函數(shù)作為對象傳遞給另一個函數(shù)。

def print_welcome():
    print('Welcome to Python Decorator!')
def print_hello(func):
    def inner():
        print('Hello!')
        func()
    return inner
decorated = print_hello(print_welcome)
decorated()
# Hello!
# Welcome to Python Decorator!

語法糖

但是,上面的代碼使用了內(nèi)部函數(shù)我們可以通過簡單地用裝飾器函數(shù) ??print_hello()??? 來裝飾 ??print_welcome()?? 函數(shù)。

裝飾器可以簡化我們的操作。功能完全一樣,但它的代碼更簡潔。即通過 ??@?? 符號簡化裝飾器的使用,如下所示:

def print_hello(func):
    def inner():
        print('Hello!')
        func()
    return inner
@print_hello
def print_welcome():
    print('Welcome to Python Decorator!')
print_welcome()
# Hello!
# Welcome to Python Decorator!

通過這樣做,我們能夠消除將一個函數(shù)顯式傳遞到另一個函數(shù)中的使用。Python 裝飾器隱式處理這一點。

使用 Python 裝飾器修改函數(shù)行為

使用 Python 裝飾器對函數(shù)進行計時

為了演示它們的實用性,讓我們構建一個函數(shù),該函數(shù)采用另一個函數(shù)并對其執(zhí)行進行計時。在這里,使用裝飾器的好處是它允許我們遵循 DRY 編程原則。

裝飾器可用于測量函數(shù)執(zhí)行所需的時間。 如果你定義一個簡單的睡眠函數(shù),以計算該函數(shù)的運行時。

import time
def timeit(func):
    def timed():
        start = time.time()
        result = func()
        end = time.time()
        print(f'Program took {(end - start) * 1000}s to run')
        return result
    return timed
@timeit
def print_welcome():
    print('Welcome to Python Decorator!')
print_welcome()
# Welcome to Python Decorator!
# Program took 0.0s to run

分析一下上面的代碼:

  • 定義了一個函數(shù) ??timeit()?? 接受另一個函數(shù)
  • 該函數(shù)還有另一個內(nèi)部函數(shù) ??timed()??
  • 函數(shù)跟蹤開始時間,執(zhí)行修飾函數(shù),跟蹤結束時間,計算差值并返回結果
  • 最后,外層函數(shù)返回內(nèi)層函數(shù)

當我們將此裝飾器函數(shù)應用于我們的函數(shù) ??print_welcome()?? 時,首先會返回歡迎問候語,然后顯示執(zhí)行時間。

使用 Python 裝飾器將有用信息記錄到終端

與上面的例子類似,我們可以在程序運行時使用裝飾器將有用的信息打印到終端。例如,我們可能想知道正在運行哪個函數(shù)以及當前時間。也可以使用裝飾器傳遞到日志文件:

from datetime import datetime
def log_info(func):
    def inner():
        print(f'Starting run at {datetime.now()}')
        print(f'Running {func.__name__}')
        func()
    return inner
@log_info
def print_welcome():
    print('Welcome to Python Decorator!')
print_welcome()
# Starting run at 2022-03-27 23:26:38.473310
# Running print_welcome
# Welcome to Python Decorator!

在上面的示例中,在運行函數(shù)之前,我們的裝飾器打印當前日期和時間以及將要運行的函數(shù)的名稱。如果您正在運行較長的腳本,并且只是想知道程序的位置,這可能很有用。

Web app 中使用的裝飾器

讓我們以 Web 應用程序的用例為例。當您在 Flask 中構建 Web 應用程序時,您總是會編寫 url 路由。 每條路線都是 Web 應用程序中的特定頁面。 打開頁面 ??/about??? 可能會調(diào)用 ??about_page() ??方法。

@app.route("/about")
def about_page():
  return "Website about nachos"

將參數(shù)傳遞給 Python 裝飾器

到目前為止,您已經(jīng)學習了如何創(chuàng)建一些有用的 Python 裝飾器。然而,這些裝飾器都沒有傳入?yún)?shù)。在本節(jié)中,您將學習如何創(chuàng)建接受參數(shù)的 Python 裝飾器。

為此,我們將允許在 Python 語法魔術解壓縮。使用 ??func_name(*args,**kwargs)??,它將解壓縮所有參數(shù)和所有關鍵字參數(shù)。通過在裝飾器中使用它,可以確保裝飾器將接受任意數(shù)量的參數(shù)或關鍵字參數(shù)。這使得它們在重復使用時更加實用。

def print_function_name(func):
    def inner(*args, **kwargs):
        print(f'Running {func.__name__}...')
        return func(*args, **kwargs)
    return inner
@print_function_name
def add_nums(a, b):
    print(a + b)
add_nums(1, 2)
# Running add_nums...
# 3

上述方法的美妙之處在于它同時接受位置和關鍵字參數(shù)。因此,即使我們以以下任何格式執(zhí)行該函數(shù),該函數(shù)也將運行:

  • ??add_nums(1024, 2020)??
  • ??add_nums(1024, b = 2021)??
  • ??add_nums(a = 1024, b = 2222)??

使用多個 Python 裝飾器

關于 Python 裝飾器的一個有趣的方式是:可以同時使用多個裝飾器。這意味著您可以將多個裝飾器應用于單個函數(shù)。為了理解這一點,來看一個例子:

def one(func):
    def inner(*args, **kwargs):
        print('1')
        return func(*args, **kwargs)
    return inner
def two(func):
    def inner(*args, **kwargs):
        print('2')
        return func(*args, **kwargs)
    return inner
@one
@two
def speak(text):
    print(text)
speak('Hello')
# 1
# 2
# Hello

我們的裝飾器函數(shù)所做的唯一事情就是打印出數(shù)字 1 和數(shù)字 2。通過將裝飾器 ??@one??? 放在 ??@two??? 之前,您可以將 ??two()???包裝的函數(shù)包裝為 ??one()??。為了說明這一點,您可以切換順序以查看如何修改行為:

# Changing decorator order
@two
@one
def speak(text):
    print(text)
speak('Hello')
# 2
# 1
# Hello

通過首先放置 ??@two?? 裝飾器,該函數(shù)成為最外層的函數(shù)。

總結

在本文中,我們先了解了什么是 Python 裝飾器,它代表元編程的語法糖。 Python 裝飾器允許我們修改函數(shù)行為并允許我們以不同的方式擴展函數(shù)。

接著了解裝飾器是什么以及如何使用它們。學習了如何允許將參數(shù)傳遞給 Python 裝飾器,學習了幾個常見的裝飾器有用的工具。最后,如何使用多個裝飾器以及裝飾器的先后順序。

參考文章:

到此這篇關于Python中裝飾器的文章就介紹到這了,更多相關Python裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 全面解析Python中的self技巧

    全面解析Python中的self技巧

    在Python中,類的方法定義時通常會包含一個名為?self?的參數(shù),它表示對象實例本身,下面我們就來了解一下self的相關應用技巧,需要的可以參考下
    2024-01-01
  • python 使用GDAL實現(xiàn)柵格tif轉矢量shp的方式小結

    python 使用GDAL實現(xiàn)柵格tif轉矢量shp的方式小結

    今天通過本文給大家分享python 使用GDAL實現(xiàn)柵格tif轉矢量shp的方式小結,計劃是使用柵格轉矢量的方式,將柵格數(shù)據(jù)轉為矢量shp文件,然后進行矢量切片,使用Mapbox進行前端動態(tài)渲染,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-08-08
  • Python中10個常用的內(nèi)置函數(shù)詳解

    Python中10個常用的內(nèi)置函數(shù)詳解

    這篇文章主要為大家介紹了Python常用的內(nèi)置函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Python實現(xiàn)字符串反轉的9種方法(最全)

    Python實現(xiàn)字符串反轉的9種方法(最全)

    本文主要介紹了Python實現(xiàn)字符串反轉的9種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • python+rsync精確同步指定格式文件

    python+rsync精確同步指定格式文件

    這篇文章主要為大家詳細介紹了python+rsync精確同步指定格式文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • pytorch中Schedule與warmup_steps的用法說明

    pytorch中Schedule與warmup_steps的用法說明

    這篇文章主要介紹了pytorch中Schedule與warmup_steps的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python實現(xiàn)string字符串連接的方法總結【8種方式】

    Python實現(xiàn)string字符串連接的方法總結【8種方式】

    這篇文章主要介紹了Python實現(xiàn)string字符串連接的方法,結合實例形式總結分析了Python實現(xiàn)字符串連接的8種常見操作技巧,需要的朋友可以參考下
    2018-07-07
  • 修復Python?Pandas數(shù)據(jù)標記錯誤的幾種方法總結

    修復Python?Pandas數(shù)據(jù)標記錯誤的幾種方法總結

    用于分析數(shù)據(jù)的?Python?庫稱為?Pandas,在?Pandas?中讀取數(shù)據(jù)最常見的方式是通過?CSV?文件,但?CSV?文件的限制是它應該采用特定的格式,否則在標記數(shù)據(jù)時會拋出錯誤,在本文中,我們將討論修復?Python?Pandas?錯誤標記數(shù)據(jù)的各種方法
    2023-10-10
  • Python3.5文件讀與寫操作經(jīng)典實例詳解

    Python3.5文件讀與寫操作經(jīng)典實例詳解

    這篇文章主要介紹了Python3.5文件讀與寫操作,結合實例形式詳細分析了Python針對文件的讀寫操作常用技巧與相關操作注意事項,需要的朋友可以參考下
    2019-05-05
  • 詳解在Python中創(chuàng)建條形圖追趕動畫

    詳解在Python中創(chuàng)建條形圖追趕動畫

    動畫是使可視化更具吸引力和用戶吸引力的好方法。它幫助我們以有意義的方式展示數(shù)據(jù)可視化。Matplotlib是一個非常流行的數(shù)據(jù)可視化庫,通常用于數(shù)據(jù)的圖形表示以及使用內(nèi)置函數(shù)的動畫。本文將用Matplotlib繪制條形圖追趕動畫,需要的可以參考一下
    2022-03-03

最新評論

若尔盖县| 普宁市| 襄汾县| 长汀县| 南岸区| 长白| 阿勒泰市| 灵台县| 姚安县| 雅江县| 南岸区| 清涧县| 马尔康县| 文成县| 麻栗坡县| 无棣县| 西乡县| 平定县| 靖西县| 和静县| 垦利县| 嘉鱼县| 江门市| 镇康县| 涿鹿县| 根河市| 志丹县| 文安县| 马山县| 漠河县| 灵石县| 龙井市| 乌海市| 高清| 迁安市| 丰原市| 连山| 阿勒泰市| 清涧县| 龙岩市| 满城县|