• 【python之路24】装饰器


    1、装饰器的应用场景

    通常IT公司的程序开发是分工的,例如某公司某个部门负责底层函数的开发,另一个部门利用其函数实现高级功能,那么如果负责底层开发的函数需要改动,一般来说不会直接在函数上进行修改,通常利用装饰器在函数外部进行修改。

    2、装饰器之@的用法

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    #装饰器
    def outer(func):
        func()
        return lambda :123
    
    #1、首先执行outer函数,并且将其下面的函数名作为参数传给outer
    #2、将outer的返回值重新赋值给f1,即f1 = outer的返回值
    @outer
    def f1():
        print("F1")
    
    re = f1()
    print(re)

     3、装饰器的主要作用:原函数不变的情况下,可以在函数的前面或后面增加其功能。

    下面的代码:

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    def outer(func):
        def inner1():
            print('start')
            print('start')
            re = func()
            print('end')
            print('end')
            return re
        return inner1
    
    def f1():
        print('F1')
    
    f1 = outer(f1)
    f1()

    上面的代码等价于装饰器:

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    def outer(func):
        def inner1():
            print('start')
            print('start')
            re = func()
            print('end')
            print('end')
            return re
        return inner1
    @outer
    def f1():
        print('F1')
    
    f1()

     执行过程如下图:

     4、含有两个参数的装饰器

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    #含有两个参数的函数
    def outer(func):
        def inner(a1,a2):
            print('开始计算.......')
            re = func(a1,a2)
            print('计算完毕。')
            return re
        return inner
    @outer
    def add(a1,a2):
        print("复杂的计算")
        return a1+a2
    
    r = add(1,3)
    print(r)

     5、任意个参数的装饰器

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    
    def outer(func):
        def inner(*args,**kwargs):
            print("开始计算......")
            r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数
            print("计算结束。。")
            return r
        return inner
    @outer
    def f1(a1,a2):
        return a1+a2
    @outer
    def f2(a1,a2,a3):
        return a1+a2+a3
    @outer
    def f3(a1):
        return a1+1
    
    r1 = f1(10,20)
    r2 = f2(10,20,30)
    r3 = f3(10)
    print(r1,r2,r3)

     6、一个函数可以拥有多个装饰器,多个装饰器从上到下执行,例如:

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    #一个函数可以拥有多个装饰器
    def outer_0(func):
        def inner(*args,**kwargs):
            print(3.5)
            r = func(*args,**kwargs)
            return r
        return inner
    def outer(func):
        def inner(*args,**kwargs):
            print("开始计算......")
            r = func(*args,**kwargs)#可以为任何参数,python会自动处理参数
            print("计算结束。。")
            return r
        return inner
    @outer_0
    @outer
    def f1(a1,a2):
        return a1+a2
    @outer
    def f2(a1,a2,a3):
        return a1+a2+a3
    @outer
    def f3(a1):
        return a1+1
    
    r1 = f1(10,20)
    print(r1)
    
    # 结果输出:
    # 3.5
    # 开始计算......
    # 计算结束。。
    # 30

     

  • 相关阅读:
    Codeforces Round #239(Div. 2) 做后扯淡玩
    hdu 3507 Print Article
    prufer序列
    POJ 2778 DNA Sequence
    Codeforces Round #237 (Div. 2)
    poj3352
    图论知识
    POJ 2186
    Codeforces Round #236 (Div. 2)
    POJ 2823 Sliding Window
  • 原文地址:https://www.cnblogs.com/sunshuhai/p/6389019.html
Copyright © 2020-2023  润新知