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

Python中裝飾器使用方法整理

 更新時(shí)間:2023年08月23日 10:12:22   作者:小小草帽  
這篇文章主要介紹了Python中裝飾器使用方法整理,裝飾器是給現(xiàn)有的模塊增添新的小功能,可以對(duì)原函數(shù)進(jìn)行功能擴(kuò)展,而且還不需要修改原函數(shù)的內(nèi)容,也不需要修改原函數(shù)的調(diào)用,需要的朋友可以參考下

1 裝飾器初階

裝飾器是一種設(shè)計(jì)模式,起到裝飾的作用。就是在不修改函數(shù)代碼的情況下,給函數(shù)增加一些功能。

1.1 沒(méi)有使用裝飾器的例子

現(xiàn)有一個(gè)返回字符串的函數(shù),在不修改該函數(shù)的情況下,將返回的字符串轉(zhuǎn)換為大寫(xiě)字符串。

def uppercase_decorator(func):  # 定義一個(gè)函數(shù),其參數(shù)func是函數(shù)類(lèi)型參數(shù)
    def inner():   # 嵌套函數(shù)inner
        s = func()  # 調(diào)用func()函數(shù)并將返回值賦值給s變量
        make_uppercase = s.upper()   # 將字符串轉(zhuǎn)換為大寫(xiě)并賦值給make_uppercase
        return make_uppercase  # 結(jié)束嵌套函數(shù)func()調(diào)用,返回轉(zhuǎn)換之后的字符串
    return inner  # 結(jié)束函數(shù)uppercase_decorator()調(diào)用, 返回嵌套函數(shù)inner
def say_hello():
    return 'hello world.'
if __name__=="__main__":
    say_hello2 = uppercase_decorator(say_hello)  # 調(diào)用uppercase_decorator()函數(shù),實(shí)參是say_hello()函數(shù),返回值say_hello2變量也是一個(gè)函數(shù)
    print(say_hello2())  # 調(diào)用say_hello2函數(shù)

1.2 使用裝飾器

Python提供了裝飾器注釋功能,裝飾器本質(zhì)上是一個(gè)函數(shù)。 上述代碼使用裝飾器修改如下:

def uppercase_decorator(func):
    def inner():
        s = func()
        make_uppercase = s.upper()
        return make_uppercase
    return inner
@uppercase_decorator   # 使用@uppercase_decorator裝飾器聲明say_hello1()函數(shù)
def say_hello1():
    return "zhang cheng."
if __name__=="__main__":
    print(say_hello1())  # 使用裝飾器不需要顯式調(diào)用uppercase_decorator()函數(shù),直接調(diào)用say_hello1()函數(shù)即可。

1.3 同時(shí)使用多個(gè)裝飾器

一個(gè)函數(shù)可以有多個(gè)裝飾器聲明。

def uppercase_decorator(func):  # 將字符串轉(zhuǎn)換成大寫(xiě)
    def inner():
        s = func()
        make_uppercase = s.upper()
        return make_uppercase
    return inner
def backet_decorator(func): # 給字符串添加括號(hào)
    def inner():
        s = func()
        make_bracket = '(' + s + ')'
        return make_bracket
    return inner
@backet_decorator
@uppercase_decorator
def say_hello():
    return 'hello world.'
if __name__=="__main__":
    print(say_hello())

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

裝飾器本質(zhì)上是函數(shù),因此可以給裝飾器傳遞參數(shù)。

def calc(func):  # 定義裝飾器函數(shù)calc(func),其參數(shù)還是一個(gè)函數(shù)
    def wrapper(arg1):  # 定義嵌套函數(shù)wrapper(arg1),這個(gè)函數(shù)參數(shù)列表與裝飾器要注釋的函數(shù)參數(shù)列表一致
        return func(arg1)
    return wrapper
@calc
def square(n):
    return n * n
@calc
def abs(n):
    return n if n > 0 else -n
if __name__=="__main__":
    print(f"3's square is {square(3)}")
    print(f"-30's absulate is {abs(-30)}")

2 裝飾器高階

2.1 wraps(func)使用

需要使用包:

from functools import wraps

作用不改變使用裝飾器的原有函數(shù)func的結(jié)構(gòu)。(比如入?yún)⒏袷降龋琠_name__, __doc__ );

因?yàn)橐粋€(gè)原函數(shù)使用了裝飾器之后,那么它就自動(dòng)默認(rèn)指向了裝飾器函數(shù)的內(nèi)存地址。 沒(méi)有使用wraps裝飾器,代碼如下:

def add_decorator(func):
    def inner():
        """
        This is a decorator.
        :return:
        """
        func()
        pass
    return inner
@add_decorator
def add():
    """
    This is a add.
    :return:
    """
    pass
if __name__=="__main__":
    print(add.__name__)
    print(add.__doc__)

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

inner
        This is a decorator.
        :return:

結(jié)果分析:未加上@wraps()裝飾器,結(jié)果得知add函數(shù)指向的是引用的裝飾器函數(shù)inner.

使用wraps裝飾器,代碼如下:

from functools import wraps
def add_decorator(func):
    @wraps(func)
    def inner():
        """
        This is a decorator.
        :return:
        """
        func()
        pass
    return inner
@add_decorator
def add():
    """
    This is a add.
    :return:
    """
    pass
if __name__=="__main__":
    print(add.__name__)
    print(add.__doc__)

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

add
    This is a add.
    :return:

結(jié)果分析:加上@wraps()裝飾器,結(jié)果得知add函數(shù)的結(jié)構(gòu)保持不變.

提示:__name__輸出函數(shù)名; __doc__輸出對(duì)應(yīng)函數(shù)內(nèi)的注釋信息。

2.2 多層嵌套使用

from functools import wraps
def add_deco(z):
    def add_decorator(func):
        @wraps(func)
        def inner(x, y):
            return z + func(x, y)
        return inner
    return add_decorator
@add_deco(z=10)
def add(x, y):
    return x + y
if __name__=="__main__":
    print(add(5, 10))

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

25

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

相關(guān)文章

最新評(píng)論

凌云县| 文安县| 比如县| 铜山县| 汉寿县| 万山特区| 噶尔县| 新乐市| 泸西县| 友谊县| 教育| 剑川县| 康乐县| 梁山县| 石柱| 扎兰屯市| 香港 | 乐昌市| 德化县| 本溪市| 锡林浩特市| 大悟县| 长宁区| 宣威市| 沭阳县| 凯里市| 奈曼旗| 阳信县| 双辽市| 静乐县| 湖州市| 资阳市| 松溪县| 夏津县| 胶州市| 铜梁县| 五华县| 大方县| 广丰县| 德兴市| 罗田县|