• python之路--装饰器函数


    (一)装饰器的形成过程

    装饰器的本质是闭包函数的一种应用,装饰器是用来装饰函数的,在不修改原函数及其调用方式的情况下对原函数功能进行拓展。

    #简单的无参函数装饰器
    import time
    def timmer(func):
        def inner():
            start = time.time()
            func()
            end = time.time()
            print(end -start)
        return inner 
    @timmer#语法糖
    def hahaha():
        time.sleep(2)#停止时间的一种用法
        print("a")
    hahaha()
    #简单的有参函数装饰器
    import time
    def timmer(func):
        def inner(x,y):
            start = time.time()
            func(x,y)
            end = time.time()
            print(end -start)
        return inner
    @timmer
    def hahaha(a,b):
        time.sleep(2)#停止时间的一种用法
        print("aaa")
    hahaha(1,2)
    #简单的带返回值的装饰器
    import time
    def timmer(func):
        def inner(*args,**kwargs):
            start = time.time()
            se = func(*args,**kwargs)
            end = time.time()
            print(end - start)
            return se
        return inner
    @timmer
    def func2(a):
         print("in func and get a:%s"%(a))
         return "fun2 over"
    func2([1,2,3,4,5])

    装饰器的主要功能和装饰器的固定结构

    装饰器的主要功能:

    在不改变原函数及其调用方式的基础上在函数的前,后增加功能。

    装饰器的固定格式:

    #完美的装饰器格式
    def wrapper(func):
        def inner(*args,**kwargs):
            '''执行之前要做的'''
            re = func(*args,**kwargs)
            '''执行函数之后要做的'''
            return re
        return inner

    带参数的装饰器

    #装饰器多层嵌套
    def outer(flag):
        def timer(func):
            def inner(*args,**kwargs):
                if flag:
                    print("执行函数前要做的")
                re = func(*args,**kwargs)
                if flag:
                    print("执行函数后要做的")
                return re
            return inner
        return timer
    @outer("hello world")#装饰器也可传参
    def func(a,b):
        print(111)
    func(1,3)

    开放封闭原则

    1,对扩展是开放的,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何修改。所以我们必须允许代码扩展,添加新功能。

    2,对修改是封闭的,我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其修改了,很有可能影响其他已经在使用该函数的用户。

    装饰器完美遵循了这个开放封闭的原则。

    多个装饰器装饰同一个函数

    def wrapper1(func):
        def inner():
            print("wrapper1,before func")
            func()
            print("wrapper1,after func")
        return inner
    def wrapper2(func):
        def inner():
            print("wrapper2 ,before func")
            func()
            print("wrapper2,before func")
        return inner
    @wrapper1
    @wrapper2
    def f():
        print("in f")
    f()
  • 相关阅读:
    Linux常用命令解释
    RAID 10 配置流程
    VMware workstation Windows 10虚拟机安装步骤
    yum仓库配置
    vi 常用命令
    Linux设备驱动动态插入内核与直接集成到内核方式的利弊分析
    常用的Linux命令行文本处理工具总结
    CentOS使用总结(不断更新)
    vsftpd出现“Response: 500 OOPS: cannot change directory”解决方法
    NFS共享服务挂载时出现“access denied by server while mounting”的解决方法
  • 原文地址:https://www.cnblogs.com/shengzhongqiu/p/7246211.html
Copyright © 2020-2023  润新知