<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 裝飾器 > 原文: [https://pythonbasics.org/decorators/](https://pythonbasics.org/decorators/) 在本教程中學習 **Python 裝飾器**。 使用裝飾器向現有函數添加功能。 這稱為元編程。 一個函數可以將一個函數作為參數(要修飾的函數),并返回帶或不帶擴展名的相同函數。 擴展函數有時非常有用,我們將在本文稍后展示真實的示例。 ### 函數是對象 在 Python 中,一切都是對象,包括函數。 這意味著函數可以傳遞并返回。 當您看到它時,乍一看可能很奇怪: ```py def hello(): print("Hello") # even functions are objects message = hello # call new function message() ``` 調用`message()`或`hello()`方法,它們具有相同的輸出。 那是因為他們指的是同一個對象。 現在讓我們繼續裝飾。 ## 裝飾器 ### 示例 裝飾器接受一個函數,對其進行擴展并返回。 是的,**函數可以返回函數**。 ```py def hello(func): def inner(): print("Hello ") func() return inner def name(): print("Alice") obj = hello(name) obj() ``` 在上面的示例中,`hello()`是裝飾器。 在 語句中 ```py obj = hello(name) ``` 函數`name()`由函數`hello()`裝飾。 它將函數包裝在另一個函數中。 ![python decorator](https://img.kancloud.cn/88/25/88256435f5d437315a8ad9137efdc695_687x375.jpg) ### 示例 2 可以通過包裝函數來擴展它們。 ```py def who(): print("Alice") def display(func): def inner(): print("The current user is : ", end="") func() return inner if __name__ == "__main__": myobj = display(who) myobj() ``` `who()`函數由`display()`裝飾。 ### 語法糖 裝飾器是常見的,可以簡化。 盡管功能完全相同,但代碼更簡潔。 Python 可以使用**`@`符號**簡化裝飾器的使用。 ```py @hello def name(): print("Alice") if __name__ == "__main__": name() ``` 這將輸出完全相同的內容,但是是編寫代碼的更簡潔的方法。 跟我在一起。調用: ```py @hello def name(): ``` 只是一種更簡單的書寫方式: ```py obj = hello(name) ``` 在這兩種情況下,我們都將裝飾器應用于函數。 ### 參數 參數可以與裝飾器一起使用。 如果您有一個打印總和`a + b`的函數,例如 ```py def sumab(a,b): summed = a + b print(summed) ``` 您可以將其包裝在裝飾器函數中。以下示例顯示了如何執行此操作: ```py def pretty_sumab(func): def inner(a,b): print(str(a) + " + " + str(b) + " is ", end="") return func(a,b) return inner @pretty_sumab def sumab(a,b): summed = a + b print(summed) if __name__ == "__main__": sumab(5,3) ``` 函數`sumab`由函數`pretty_sumab`包裝。 這用其上方的`@`符號表示。 調用函數`sumab`,并查看帶有參數的函數`sumab`和`pretty_sumab`的邏輯都已運行。 ### 真實示例 **用例:時間測量** ![decorator example](https://img.kancloud.cn/96/06/9606b8e2641cdb11bbf4c3a24588b3f8_589x201.jpg) 裝飾器可用于測量函數執行所需的時間。 如果您定義了一個休眠的簡單函數,則 ```py def myFunction(n): time.sleep(n) ``` 然后,您只需添加`@measure_time`行即可測量所需的時間 下面的例子: ```py import time def measure_time(func): def wrapper(*arg): t = time.time() res = func(*arg) print("Function took " + str(time.time()-t) + " seconds to run") return res return wrapper @measure_time def myFunction(n): time.sleep(n) if __name__ == "__main__": myFunction(2) ``` 這將輸出執行函數`myFunction()`所花費的時間。 很酷的事情是,通過添加一行代碼`@measure_time`,我們現在可以測量程序執行時間。 ![decorator in web app](https://img.kancloud.cn/b4/a9/b4a9712cd0d0f508c37e5efd5ea2477f_584x196.jpg) **用例:Web 應用程序** 讓我們以 Web 應用程序的使用案例為例。 在 Flask 中構建 Web 應用程序時,您始終會編寫網址路由。 每個路由都是 Web 應用程序中的特定頁面。打開頁面`/about`可以調用`about_page()`方法。 ```py @app.route("/about") def about_page(): return "Website about nachos" ``` 在這種情況下,它使用`@`符號進行裝飾。 [下載示例和練習](https://gum.co/dcsp)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看