Python 裝飾器 Decorator - 基本篇 By 彭彭

Поделиться
HTML-код
  • Опубликовано: 18 ноя 2024

Комментарии • 88

  • @Eekmomo
    @Eekmomo Месяц назад +1

    非常感謝老師!一教就懂,十分受用!

    • @cwpeng-course
      @cwpeng-course  Месяц назад

      感謝回饋,很高興對你有幫助!

  • @ShiYu0318
    @ShiYu0318 3 года назад +3

    找了好久都沒有裝飾器的教學 真的太棒了!

    • @cwpeng-course
      @cwpeng-course  3 года назад +1

      比較進階的主題教學會少一些,希望能補足這些內容 :)

  • @AK-di6xs
    @AK-di6xs 3 года назад

    期待更多python教學 彭彭老師教多少我就學多少!
    謝謝彭彭老師~
    =========================================
    # 裝飾器 Decorator - 基本篇
    # 裝飾器 Decorator : 特殊設計的函示,用來 [ 輔助 ] 其他的函式
    # 基本裝飾器
    # 定義裝飾器
    # def 裝飾器名稱(回呼函式名稱):
    # def 內部函式名稱():
    # 裝飾式內部的程式碼
    # 回呼函式名稱()
    # return 內部函式名稱
    # 使用裝飾器
    # @裝飾器名稱
    # def 函式名稱():
    # 函式內部的程式碼
    # 函式名稱() # 呼叫帶有裝飾器的函式
    # 程式範例
    # def testDecorator(callback):
    # def innerFunc():
    # print("裝飾器")
    # callback()
    # return innerFunc
    # @testDecorator
    # def decoratedFunc():
    # print("普通函式")
    # decoratedFunc() # 大方向 : 先執行裝飾器內部的程式碼再執行本來的程式碼
    # 程式範例
    # def testDecorator(callback):
    # def innerFunc():
    # print("裝飾器")
    # callback(3)
    # return innerFunc
    # @testDecorator
    # def decoratedFunc(data):
    # print("普通函式",data)
    # decoratedFunc() # decoratedFunc()->testDecorator(callback)->執行裝飾器內部程式碼innerFunc()->callback等於decoratedFunc->執行decoratedFunc
    #===================================================
    # 定義裝飾器
    def myDeco(cb):
    def run():
    print("裝飾器中的程式碼")
    cb(3) # 這個回呼函式,其實就是被裝飾的普通函式
    return run
    # 使用裝飾器
    @myDeco
    def test(n):
    print("普通函式的程式碼",n) # 整個看在一起 就是一個帶有裝飾器的函式
    test()
    print("==============================")
    # 以上為裝飾器運作的基本原則 是規矩 沒有道理
    # 定義一個裝飾器,計算 1+2+...+50 的總和
    def calculate(callback):
    def run():
    # 裝飾器想要執行的程式碼
    result=0
    for n in range(51):
    result=n+result # 也可以寫 result+=n
    # 把計算結果透過參數傳到被裝飾的普通函式中
    callback(result)
    return run
    # 使用裝飾器 # 進行函式分工切割 裝飾器內部負責計算 show 負責顯示
    @calculate
    def show(n):
    print("計算結果是",n)
    @calculate # 只要用很簡單的語法就可以重複利用上面裝飾器內的功能,去輔助不同的函式來運作 重複利用只要用 @裝飾器名稱 很簡潔
    def showEnglish(n):
    print("Result is", n)
    show()
    showEnglish()

  • @nini_li1991
    @nini_li1991 2 года назад +1

    還好有彭彭老師,不然我真的看不太懂書裡的意思。而且我每集都看過5次以上,第一次深感雖然說的是中文但還是聽不懂是什麼樣的感覺。還好可以一直重覆看哈哈哈真的很感謝您

    • @cwpeng-course
      @cwpeng-course  2 года назад +1

      哈哈哈,謝謝你的回饋和分享哦 :) 程式有時候聽中文解釋,不如直接實驗程式碼的運作,你會發現更容易一點 ~

  • @Recordingization
    @Recordingization Год назад

    听老师的课程很清晰,一个视频就可以拨云见日,感谢老师的讲解。

  • @lancezhang892
    @lancezhang892 9 месяцев назад

    蛮有趣的,加上装饰器符号,直接把回呼函数丢给了装饰器最外面的函数作为参数。这个应该是把test函数的入口地址给了装饰器函数吧。

  • @hara4565
    @hara4565 3 года назад

    今天看懂flask為什麼要使用裝飾器了,感謝彭彭

    • @cwpeng-course
      @cwpeng-course  3 года назад

      讚讚,能理解常用的框架背後的程式技巧真的很不錯 ~

  • @chendk4644
    @chendk4644 3 года назад

    終於等到老師講裝飾器,必需給like👍

    • @cwpeng-course
      @cwpeng-course  3 года назад +1

      哈哈哈,謝謝你的 like 👍👍

  • @爱熊熊-x1h
    @爱熊熊-x1h 2 года назад +1

    感謝老師 看完python就馬上加會員了 太值得了

    • @cwpeng-course
      @cwpeng-course  2 года назад

      哈哈哈,其實我自己也是覺得挺值得的 >//////

    • @xuno
      @xuno 7 месяцев назад

      好熊寶 學程式 素質高 讚讚

  • @Kavinqq
    @Kavinqq 2 года назад

    謝謝你的教學! 最近工作需要要自學Python, 一系列的教學很有幫助 感謝你.

    • @cwpeng-course
      @cwpeng-course  2 года назад

      謝謝你的回饋,也很高興對你有幫助 :)

  • @a2265848
    @a2265848 3 месяца назад +1

    淺顯易懂,非常謝謝

  • @mr.yellow7084
    @mr.yellow7084 3 года назад

    太棒了!是新的python教學!我還不把他學起來!

  • @rogersho9913
    @rogersho9913 3 года назад

    老師,你裝飾器講得太好了,讓我更了解函式的使用

  • @guild2983
    @guild2983 7 месяцев назад +1

    講得非常清楚,厲害~

  • @po-hsienli698
    @po-hsienli698 Год назад +1

    彭彭老師好~~練習寫函數的時候回頭看decorator的教學影片才發現在return的位置好像沒有縮排? 但想不太透為何 (還是這就是decorator語法的硬性規定?) 謝謝!

    • @cwpeng-course
      @cwpeng-course  Год назад

      影片中程式的 return 是對應到外層的 calculate 函式,所以沒有跟著縮排進去 ~

  • @hsiuyi0804
    @hsiuyi0804 9 месяцев назад +1

    老師:請問為什麼有了普通函式還要回呼函式及裝飾器,分別是什麼情況會用到回呼函式及裝飾器呢?謝謝

    • @cwpeng-course
      @cwpeng-course  9 месяцев назад

      回呼函式其實就是函式,只是透過參數傳遞給另外一個函式使用而得名,裝飾器是一種包裝的手法,通常我們利用這些手法去包裝程式之後,有機會讓他人可以更方便的使用我們包裝後的工具,這就是目的。
      幾百行的簡單程式,通常不需要複雜的包裝,所以會沒甚麼感覺。建議可以參考頻道中 Python Flask 的教學,你可以體會別人如何使用裝飾器包裝一個後端框架,讓我們更輕鬆的定義路由的概念。

  • @林立倫-b6l
    @林立倫-b6l 3 года назад

    講的很好,容易懂👍👍

  • @JackTall-gz5dg
    @JackTall-gz5dg 3 года назад +3

    想請問 那為何不用class的繼承去做呢
    還是裝飾器 有比較特殊的功能?
    謝謝 🙏🙏

    • @cwpeng-course
      @cwpeng-course  3 года назад +8

      我會把裝飾器和 Class 繼承當作是兩種不同的設計模式的工具,前者是 Functional Programming 的思維,後者是物件導向思維,所以不會混在一起思考。
      裝飾器就只是在一個函式執行的時候,額外加上一段流程。類別的繼承比較像是用來描述數個物件或抽象概念之間的關係。

    • @JackTall-gz5dg
      @JackTall-gz5dg 3 года назад +1

      @@cwpeng-course 謝謝!

  • @kiwiwiki3917
    @kiwiwiki3917 Год назад +1

    8:00 我們呼叫一個帶有裝飾器的函示,他就不會直接執行函式內的程式,我們呼叫一個帶有裝飾器的函式,這個函式本身就會被丟的回呼函式,然後先執行裝飾器中的內部函式印出裝飾器,再呼叫回呼函式,然後才呼叫回本來的函式中印出普通函式,然後程式結束。
    函式、程式、回呼、裝飾、呼叫無限循環,聽到都腦霧了~~

    • @cwpeng-course
      @cwpeng-course  Год назад

      先試著確實追蹤程式的執行流程就可以了,中文解釋起來確實很複雜,但若透過程式碼去把每一個步驟印出來,觀察印出來的順序,就自然會知道運作的方式。

  • @L0ng47
    @L0ng47 3 года назад +1

    14:30 不知道能不能這樣理解,@myDeco 其實等同於 在test()前面加上一句 test = myDeco(test) ?

    • @cwpeng-course
      @cwpeng-course  3 года назад +1

      可以哦,不過要特別強調的是使用沒有裝飾器的 test,再加上你提到的程式語法來做出裝飾器的行為流程。

  • @luceca7700
    @luceca7700 2 года назад

    有看過這樣的寫法,好像也是可以成功
    想問這和影片中的算是同一個概念嗎?
    def a(func):
    print('makeup...')
    return func
    # 裝飾器寫在 b 的前面,表示裝飾 b
    @a
    def b():
    print('go!!!!')
    b()
    # makeup...
    # go!!!!

    • @cwpeng-course
      @cwpeng-course  2 года назад

      很棒的嘗試,是同一個概念沒錯哦 ~

  • @lancezhang892
    @lancezhang892 9 месяцев назад

    视频19分54秒的部分。函数里test(n)是有参数的,为什么最下面调用的时候不需要加参数只用test()就可以完成使用了?

  • @wei5146
    @wei5146 2 года назад +1

    真的好感動 從0開始的小白想要謝謝彭彭老師的付出 想請問如果有更進階的課程可以去哪裡報名呢?

    • @cwpeng-course
      @cwpeng-course  2 года назад

      歡迎查看我們的會員專屬教學,看看有沒有你有興趣的部份嘍 ~
      ruclips.net/p/UUMOguZS-y7codLSt6vpkVdnKg

  • @魚人-s1z
    @魚人-s1z 2 года назад

    彭彭老師 不好意思想離題問一下 python有辦法做到產生qrcode後,偵測qrcode是否被掃瞄來執行程式嗎 或是類似的操作

  • @jasonwhitemin
    @jasonwhitemin 3 года назад +1

    感謝老師!!是說在FLASK中也會有看到類似裝飾器的使用,但是其實都有點不太明白原理,是不是跟老師這次講的屬於相同應用呢?

    • @cwpeng-course
      @cwpeng-course  3 года назад +5

      對哦,Flask 裡面的路由就是使用裝飾器來實作的,你可以想像 @app.route 背後會幫我們處理完路由的底層邏輯,然後再呼叫我們提供的路由函式。

    • @jasonwhitemin
      @jasonwhitemin 3 года назад +2

      @@cwpeng-course 感謝老師說明~~

  • @yongxu4525
    @yongxu4525 3 года назад +2

    可以讲一讲机器学习/深度学习吗

  • @bongakawa2723
    @bongakawa2723 2 года назад

    彭彭老師,您好
    # def testDecorator(callback):
    # def innerFunc():
    # print("裝飾器")
    # callback()
    # return innerFunc
    # @testDecorator
    # def decoratedFunc():
    # print("普通函式")
    想請問return innerFunc回傳內部函式名稱的用途是什麼?
    如果我不寫這行會出現TypeError: 'NoneType' object is not callable

    • @cwpeng-course
      @cwpeng-course  2 года назад

      他是裝飾器的規矩,我們一定得回傳一個函式,讓裝飾器可以呼叫這個函式執行一些動作 ~

    • @bongakawa2723
      @bongakawa2723 2 года назад +1

      @@cwpeng-course 好的!謝謝老師的回覆

  • @tony0731
    @tony0731 2 года назад

    謝謝教學!想請問這樣 show(), showEnglish() 裡面還能傳參數嗎?
    像是想要改變 1+2+...+x 中 x 的值來得到不同的 sum
    能做到下面這樣的呼叫嗎?
    showEnglish(5) --> Result is 15
    showEnglish(10) --> Result is 55

    • @cwpeng-course
      @cwpeng-course  2 года назад +2

      可以哦,你可以參考以下程式:
      def deco(callback):
      def execute(n):
      callback(n*3)
      return execute
      @deco
      def show(result):
      print(result)
      show(3)

    • @tony0731
      @tony0731 2 года назад +1

      @@cwpeng-course 了解了~謝謝您!

    • @po-hsienli698
      @po-hsienli698 Год назад

      還好有看到這則留言,原來呼叫時候的給的值會被對接到 run(argument) 那邊XD
      這樣就可以更自由的運用了~~~太感謝了!

  • @daniel870217
    @daniel870217 2 года назад

    用while寫的
    def mydeco (callback):
    def iii ():
    n1=0
    sum=0
    while n1

    • @cwpeng-course
      @cwpeng-course  2 года назад +1

      很不錯哦,感謝你的分享 :)

  • @好好笑-l2q
    @好好笑-l2q 2 года назад

    老師你好!請問 25:40的result=n嗎?
    可以這樣理解嗎?
    謝謝老師!

    • @cwpeng-course
      @cwpeng-course  2 года назад

      result 的資料透過參數傳遞到 n,不會去簡化這個理解 ~

  • @dannybot520
    @dannybot520 3 года назад

    簡單明瞭^0^ 謝謝老師

  • @paulchang2006
    @paulchang2006 3 года назад

    show() and showEnglish() take one parameter - n, how come in the end you call show() and showEnglish() without passing argument?

    • @cwpeng-course
      @cwpeng-course  3 года назад

      Behavior of decorated show and showEnglish is not the same as normal function. They are passing into decorator function, named callback function, and called from inside of decorator function.

  • @OpKevinYouTube
    @OpKevinYouTube 3 года назад

    謝謝彭彭老師

  • @submit1204
    @submit1204 Месяц назад +1

    裝飾器 有點「MVC」的感覺。

  • @CRJakaAnfer
    @CRJakaAnfer 3 года назад

    跟課邏輯都聽得懂 但不知道實務上作用好處在哪
    從generator、callback function到decorator都有這樣的問題 QQ

    • @cwpeng-course
      @cwpeng-course  3 года назад +2

      Generator 通常使用在資料量非常大的狀況,所謂的資料量大,不是幾千幾萬筆,是百萬起跳上億這樣。Callback Function 就只是一個小技巧,了解這個技巧才方便進一步了解更多其他技巧,例如 Decorator。裝飾器在某些時候使用起來會非常的有味道,最標準的例子就是 Flask 框架使用裝飾器來處理路由。
      初學不容易感覺到實際用處,因為這些技巧通常要在更加複雜或進階的情境中才會真的有意義,所以在碰到之前,大概不會有特別的實感。不過先學著沒甚麼壞處,說現實點面試的時候能回答得出來就是加分,如此而已。

    • @CRJakaAnfer
      @CRJakaAnfer 3 года назад +1

      @@cwpeng-course 在Flask課程中 有感覺到裝飾器的實際用途 其他的或許就待以後更熟稔之後體會了 謝老師

  • @tsaijing-ling3100
    @tsaijing-ling3100 3 года назад +1

    ### The different vectors' lengths on two-dimension by using Decorator
    #******** define decorator ***********#
    def vectorLength(callback):
    def calculateLength(x,y):
    answer= (x**2 + y**2)**0.5
    callback(answer)
    return calculateLength
    #******** use decorator ************#
    @vectorLength
    def lengthInt(answer):
    print("The length of integer vector input:",answer)
    @vectorLength
    def lengthFloat(answer):
    print("The length of float vector input", answer)
    #******** call function ************#
    lengthInt(3,4)
    lengthInt(2,-7)
    lengthFloat(3.0,4.0)
    lengthFloat(-2.7,3.8)
    彭彭老師您好:
    弟子寫了一個很奇怪的decorator,call function 裡面的參數是座標,跟被裝飾器裡的參數 (是答案) 不一樣,跑出來結果是對的,有請師父解惑。謝謝您!

    • @cwpeng-course
      @cwpeng-course  3 года назад +1

      看起來很好呀,座標傳遞到 x 和 y 中計算最後的長度,再傳回本來的函式中顯示。不確定你的問題是?

    • @tsaijing-ling3100
      @tsaijing-ling3100 3 года назад

      @@cwpeng-course 我的問題是,我的call function 引數是(3,4),有兩個值,回呼函式(本來的函式)的引數是(answer),只有一個值,兩個format不一樣,請問老師這樣呼叫是合法的嗎? 謝謝老師!

    • @cwpeng-course
      @cwpeng-course  3 года назад

      @@tsaijing-ling3100 你的 call function 的兩個值是對應到 calculateLength 裡的 x, y 所以是對上的 ~

    • @tsaijing-ling3100
      @tsaijing-ling3100 3 года назад +1

      @@cwpeng-course 老師,所以我的call function (lengthInt , lengthFloat)的引數(x值 , y值)是可以跟回呼函式 (就是被call function呼叫的函式) 的引數(answer) 不同格式的是嗎? 我寫這隻程式然後改到懷疑人生,只好跟老師求助

    • @cwpeng-course
      @cwpeng-course  3 года назад +1

      @@tsaijing-ling3100 是壓,你的程式能正常運作就已經說明了這點 ~

  • @黃柏翔-e1v
    @黃柏翔-e1v 2 года назад

    快來加入彭彭的會員.