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

แชร์
ฝัง
  • เผยแพร่เมื่อ 24 ธ.ค. 2024

ความคิดเห็น • 88

  • @ShiYu0318
    @ShiYu0318 3 ปีที่แล้ว +3

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

    • @cwpeng-course
      @cwpeng-course  3 ปีที่แล้ว +1

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

  • @Eekmomo
    @Eekmomo 3 หลายเดือนก่อน +1

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

    • @cwpeng-course
      @cwpeng-course  2 หลายเดือนก่อน

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

  • @nini_li1991
    @nini_li1991 2 ปีที่แล้ว +1

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

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว +1

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

  • @a2265848
    @a2265848 5 หลายเดือนก่อน +1

    淺顯易懂,非常謝謝

  • @Recordingization
    @Recordingization ปีที่แล้ว

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

  • @chendk4644
    @chendk4644 3 ปีที่แล้ว

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

    • @cwpeng-course
      @cwpeng-course  3 ปีที่แล้ว +1

      哈哈哈,謝謝你的 like 👍👍

  • @爱熊熊-x1h
    @爱熊熊-x1h 2 ปีที่แล้ว +1

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

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว

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

    • @xuno
      @xuno 8 หลายเดือนก่อน

      好熊寶 學程式 素質高 讚讚

  • @hara4565
    @hara4565 3 ปีที่แล้ว

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

    • @cwpeng-course
      @cwpeng-course  3 ปีที่แล้ว

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

  • @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()

    • @cwpeng-course
      @cwpeng-course  3 ปีที่แล้ว

      哈哈哈,好哦,加油 :)))

  • @guild2983
    @guild2983 8 หลายเดือนก่อน +1

    講得非常清楚,厲害~

  • @rogersho9913
    @rogersho9913 3 ปีที่แล้ว

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

  • @mr.yellow7084
    @mr.yellow7084 3 ปีที่แล้ว

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

  • @lancezhang892
    @lancezhang892 10 หลายเดือนก่อน

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

  • @Kavinqq
    @Kavinqq 2 ปีที่แล้ว

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

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว

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

  • @kiwiwiki3917
    @kiwiwiki3917 ปีที่แล้ว +1

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

    • @cwpeng-course
      @cwpeng-course  ปีที่แล้ว

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

  • @林立倫-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 謝謝!

  • @po-hsienli698
    @po-hsienli698 ปีที่แล้ว +1

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

    • @cwpeng-course
      @cwpeng-course  ปีที่แล้ว

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

  • @jasonwhitemin
    @jasonwhitemin 3 ปีที่แล้ว +1

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

    • @cwpeng-course
      @cwpeng-course  3 ปีที่แล้ว +5

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

    • @jasonwhitemin
      @jasonwhitemin 3 ปีที่แล้ว +2

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

  • @hsiuyi0804
    @hsiuyi0804 10 หลายเดือนก่อน +1

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

    • @cwpeng-course
      @cwpeng-course  10 หลายเดือนก่อน

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

  • @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 ปีที่แล้ว

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

  • @好好笑-l2q
    @好好笑-l2q 2 ปีที่แล้ว

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

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว

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

  • @魚人-s1z
    @魚人-s1z 2 ปีที่แล้ว

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

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว

      沒有很理解你提的情境呢 ~

  • @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
      這樣就可以更自由的運用了~~~太感謝了!

  • @lancezhang892
    @lancezhang892 10 หลายเดือนก่อน

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

  • @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 好的!謝謝老師的回覆

  • @wei5146
    @wei5146 2 ปีที่แล้ว +1

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

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว

      歡迎查看我們的會員專屬教學,看看有沒有你有興趣的部份嘍 ~
      th-cam.com/play/UUMOguZS-y7codLSt6vpkVdnKg.html

  • @yongxu4525
    @yongxu4525 3 ปีที่แล้ว +2

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

  • @dannybot520
    @dannybot520 3 ปีที่แล้ว

    簡單明瞭^0^ 謝謝老師

  • @daniel870217
    @daniel870217 2 ปีที่แล้ว

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

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว +1

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

  • @OpKevinYouTube
    @OpKevinYouTube 3 ปีที่แล้ว

    謝謝彭彭老師

  • @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.

  • @submit1204
    @submit1204 2 หลายเดือนก่อน +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課程中 有感覺到裝飾器的實際用途 其他的或許就待以後更熟稔之後體會了 謝老師

  • @黃柏翔-e1v
    @黃柏翔-e1v 2 ปีที่แล้ว

    快來加入彭彭的會員.

    • @cwpeng-course
      @cwpeng-course  2 ปีที่แล้ว

      XDDDDD 謝謝你的支持哪 ~

  • @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 是壓,你的程式能正常運作就已經說明了這點 ~