zoukankan      html  css  js  c++  java
  • 装饰器

    • 

    # 基础的装饰器
    def wrappper(func):
        def inner(*args,**kwargs):
            '''在函数被调用之前添加的代码'''
            res = func(*args,**kwargs)
            '''在函数被调用之后添加的代码'''
            return res
        return inner
    # 完美的装饰器
    from functools import wraps
    def wrapper(func):
        @wraps(func)
        def inner(*args,**kwargs):
            '''在函数被调用之前添加的代码'''
            res = func(*args,**kwargs)
            '''在函数被调用之后添加的代码'''
            return res
        return inner
    @wrapper
    def func():  # inner()
        pass
    func()  # 执行func()实际上执行的是inner()            
    func._name_  # 查看func函数的名字,但此时func函数的名字是inner的名字,因此需用 @wraps(func)
    # 带参数的装饰器
    # @wrapper --> @wrapper(argument)
    # 三层嵌套函数
    def outer(形参):
        def wrapper(func):
            def inner(*args,**kwargs):
                 '''在函数被调用之前添加的代码'''
                 ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用
                 '''在函数被调用之后添加的代码'''
                 return ret
                eturn inner
        return wrapper
    @outer(实参)
    def func():
        pass 
    # 多个装饰器装饰一个函数      俄罗斯套娃的执行顺序
    def wrappper1(func):
        def inner(*args,**kwargs):
            '''在函数被调用之前添加的代码1'''      1      
            res = func(*args,**kwargs)             3
            '''在函数被调用之后添加的代码'''       6
            return res
        return inner
    def wrappper2(func):
        def inner(*args,**kwargs):
            '''在函数被调用之前添加的代码'''       2
            res = func(*args,**kwargs)             4
            '''在函数被调用之后添加的代码'''       5
            return res
        return inner
    @wrapper1
    @wrapper2
    def func():
        print(' ')
    func()

    • 装饰器的作用 —— 不修改函数的调用方式 但想在原来的函数前后添加功能,可以有多个装饰器,但只对一个函数,有一些装饰作用

    • 原则: 开放封闭原则     开放 :扩展是开放的      封闭 :对修改是封闭的

    • 图解

    • 装饰器例子

    def wrapper(f):    # 这是装饰器函数  f是被装饰的函数名
        def inner(*args,**kwargs):
            '''在被装饰函数之前要做地事'''
            res = f(*args,**kwargs)      # 动态参数*args,**kwargs要原封不动地传给被装饰的函数f,且被装饰函数执行完的返回值要返回给res接收
            '''在被装饰函数之后要做地事'''
            return res
        return inner

     • 

    # 装饰器的固定模式
    def wrapper(func):     # 5 而func就是qqxing
        def inner(*args,**kwargs):
            res = func(*args,**kwargs)     # 1 被装饰函数需要参数和返回值是res(以res接收它的返回值)  #被装饰的函数func(*args,**kwargs)
            return res                     # 2 再把res返回给“我”
        return inner
    
    @wrapper         # 3 等同于 qqxing = wrapper(qqxing),把下面函数的名字作为参数且执行完装饰器函数(wrapper)之后的返回的inner还叫qqxing  
    def qqxing():    # 4 qqxing()函数“使用”了 wrapper 装饰器
        print(520)
        
    res = qqxing()  # 6 而qqxing此刻是inner,因为qqxing = wrapper(qqxing)中执行完wrapper(qqxing)之后返回的qqxing以res接收返回值                                                                                       
    print(res)

     •

    def wrapper(func):
        def inner(*args,**kwargs):
            print('在被装饰的函数执行之前做的事')
            ret = func(*args,**kwargs)
            print('在被装饰的函数执行之后做的事')
            return ret
        return inner  # 把inner的内存地址返回回来,让下一行注释的lover接收
    @wrapper          # 等效于lover = wrapper(lover)
    def lover(date):
        print('We have been %s days falling in love'% date )
        return 'love story'
    ret = lover(24)
    print(ret)

    • 

    def outer(*args,**kwargs):
        print(args)
        print(*args)
        def inner(*args):
            print('inner:',args)
        inner(*args)
    outer(1,2,3,4)
    # 关于*args,接收就是聚合,调用就是打散

    作者:chauncylii

    出处:https://www.cnblogs.com/passengerlee/p/11965398.html

    版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

    觉得文章不错,点个关注呗!

  • 相关阅读:
    prim 堆优化+ kruskal 按秩优化
    poj 2679 Adventurous Driving(SPFA 负环)
    poj 1125 Stockbroker Grapevine (dij优化 0ms)
    codevs 4909 寂寞的堆(写的好丑0.0)
    noi 7221 拯救公主 (状态压缩+bfs)
    codevs2059逃出克隆岛(传送门bfs)
    HUD3336
    poj 3974 Palindrome
    疑难杂症
    正则表达 比较两个浮点数
  • 原文地址:https://www.cnblogs.com/passengerlee/p/10354014.html
Copyright © 2011-2022 走看看