裝飾器

[TOC]

函數(shù)

函數(shù)定義

def function():
    return

函數(shù)調(diào)用

function()

高階函數(shù)

def func(function):
  print(function)
  return

嵌套函數(shù)

def function1:
  def function2:
    print("this is second function")
  function2()
function1()

裝飾器

裝飾器=高階函數(shù)+嵌套函數(shù)

基礎(chǔ)裝飾器

假設(shè)有一個(gè)計(jì)算器函數(shù)1:

def calculator():
    x=float(input("please input x value:"))
    y=float(input("please input y value:"))
    z=x+y
    print(z)
calculator()

以上運(yùn)行結(jié)果為:


計(jì)算器函數(shù)

現(xiàn)在要在不修改源代碼調(diào)用方式的情況下為計(jì)算過(guò)程添加裝飾性文字,故必須使用裝飾器:

# 裝飾器函數(shù)
def decoration(function):
    def wrapper():
        print("----計(jì)算函數(shù)開(kāi)始-------")
        function()
        print("----計(jì)算函數(shù)終止-------")
    return wrapper

# 語(yǔ)法糖
@decoration
# 計(jì)算器函數(shù)1
def calculator():
    x=float(input("please input x value:"))
    y=float(input("please input y value:"))
    z=x+y
    print(z)
calculator()

帶形參的裝飾器

現(xiàn)在,由于新需求產(chǎn)生,我需要計(jì)算一些帶形參的函數(shù):

def calculator_1(a,b):
    z=a+b
    print(z)

要想使其擁有計(jì)算器函數(shù)1相同的裝飾,需要更改裝飾器,但同時(shí)要兼容計(jì)算器函數(shù)1!

# 裝飾器函數(shù)
def decoration(function):
    def wrapper(*args,**kwargs):
        print("----計(jì)算函數(shù)開(kāi)始-------")
        function(*args,**kwargs)
        print("----計(jì)算函數(shù)終止-------")
    return wrapper

# 語(yǔ)法糖
@decoration
# 計(jì)算器函數(shù)1
def calculator():
    x=float(input("please input x value:"))
    y=float(input("please input y value:"))
    z=x+y
    print(z)

@decoration
# 計(jì)算器函數(shù)2
def calculator_1(a,b):
    n=a+b
    print(n)
calculator()
calculator_1(5,7)

運(yùn)行結(jié)果:


形參裝飾器

帶返回值的裝飾器

若函數(shù)返回值為,運(yùn)行結(jié)果為None,如果將計(jì)算器函數(shù)1加入返回值,運(yùn)行結(jié)果為:

image

None ?怎么會(huì)為空呢,原因是裝飾器在函數(shù)運(yùn)行時(shí)無(wú)返回 。

# 裝飾器函數(shù)
def decoration(function):
    def wrapper(*args,**kwargs):
        print("----計(jì)算函數(shù)開(kāi)始-------")
        return function(*args,**kwargs) #返回調(diào)用函數(shù)結(jié)果
        print("----計(jì)算函數(shù)終止-------")
    return wrapper

# 語(yǔ)法糖
@decoration
# 計(jì)算器函數(shù)1
def calculator():
    x=float(input("please input x value:"))
    y=float(input("please input y value:"))
    z=x+y
    print(z)
    return z

@decoration
# 計(jì)算器函數(shù)2
def calculator_1(a,b):
    n=a+b
    print(n)


print("this is printer:",calculator())
calculator_1(5,7)
image

為不同函數(shù)提供不同裝飾

# 裝飾器函數(shù)
def choose(way):
    def decoration(function):
        def wrapper(*args,**kwargs):
            if way==1:
                print("----計(jì)算函數(shù)開(kāi)始1-------")
                return function(*args, **kwargs)
                print("----計(jì)算函數(shù)終止1-------")
            else:
                print("----計(jì)算函數(shù)開(kāi)始2-------")
                function(*args, **kwargs)
                print("----計(jì)算函數(shù)終止2-------")


        return wrapper
    return decoration

# 語(yǔ)法糖
@choose(way=1)
# 計(jì)算器函數(shù)1
def calculator():
    x=float(input("please input x value:"))
    y=float(input("please input y value:"))
    z=x+y
    print(z)
    return z

@choose(way=2)
# 計(jì)算器函數(shù)2
def calculator_1(a,b):
    n=a+b
    print(n)


print("this is printer:",calculator())
calculator_1(5,7)

運(yùn)行結(jié)果:


choose
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 函數(shù) 什么是函數(shù)? 將具有某種功能的代碼放到一起, 構(gòu)成一個(gè)函數(shù).為什么說(shuō)函數(shù)? 因?yàn)樾枰芯恳粋€(gè)問(wèn)題, 函數(shù)可以...
    DragonFangQy閱讀 1,289評(píng)論 0 2
  • 在學(xué)習(xí)Python的過(guò)程中,我相信有很多人和我一樣,對(duì)Python的裝飾器一直覺(jué)得很困惑,我也是困惑了好久,并通過(guò)...
    lijincheng閱讀 6,455評(píng)論 0 5
  • 本文為《爬著學(xué)Python》系列第四篇文章。從本篇開(kāi)始,本專欄在順序更新的基礎(chǔ)上,會(huì)有不規(guī)則的更新。 在Pytho...
    SyPy閱讀 2,570評(píng)論 4 11
  • 轉(zhuǎn)載來(lái)自:http://blog.csdn.net/u013471155 在學(xué)習(xí)Python的過(guò)程中,我相信有很多...
    JM68閱讀 676評(píng)論 3 9
  • 背景 雖然之前看過(guò)裝飾器的相關(guān)內(nèi)容,但是今天想起來(lái),一直沒(méi)有好好總結(jié)一下,所以特地記錄下關(guān)于裝飾器的一系列用法。要...
    樓上小宇閱讀 781評(píng)論 0 3

友情鏈接更多精彩內(nèi)容