zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Maven进价:Maven构建系列文章
    mybatis.net insert 返回主键
    IIS限制ip访问
    mybatis学习资源
    MVC4发布到IIS,出现HTTP 错误 404.0
    ElasticSearch 7.4.2 Root mapping definition has unsupported parameters
    钉钉网页版全屏
    sudo go 找不到命令
    ubuntu安装navicat
    golang 自动下载所有依赖包
  • 原文地址:https://www.cnblogs.com/shengzhongqiu/p/7246211.html
Copyright © 2011-2022 走看看