• Python3.x基础学习-装饰器


    装饰器

    1.装饰器函数的本质:一个闭包函数
    2.装饰器函数的作用:在不修改原函数及其调用方式的情况下对原函功能进行扩展
    3.语法格式: @装饰器名称

    def foo():
        print('foo')
    foo()
    # 公司有N个部门,每个部门负责相应的业务
    
    def f1():
        print("身份验证")
        print("f1")
    
    def f2():
        print("身份验证")
        print("f2")
    
    def f3():
        print("身份验证")
        print("f3")
    def f4():
        print("身份验证")
        print("f4")
    
    f4()
    
    # 身份验证
    # f4
    #更改
    #
    def check():
        print('身份验证')
    
    def f1():
        check()
        print("f1")
    
    def f2():
        check()
        print("f2")
    
    def f3():
        check()
        print("f3")
    def f4():
        check()
        print("f4")
    
    f3()
    
    # 身份验证
    # f3
    # 开放封闭原则
    # 封闭:对已经实现的功能代码块,不能轻易修改
    # 开发:可以对外扩展功能
    
    def check(f):
        def inner():
            print("身份验证")
            f()
        return inner
    
    @check
    
    def f1():
        print("f1")
    
    @check
    
    def f2():
        print("f2")
    
    # f1()
    f2()
    def outter(f):
        def inner():
            print("---这是内嵌函数---")
            f()
            print('---在这里执行完了--')
        print("---外层函数---")
        return inner
    
    @outter
    
    def func():
        print("----就看看你想干哈----")
    
    func()
    print(func.__name__)
    
    # ---外层函数---
    # ---这是内嵌函数---
    # ----就看看你想干哈----
    # ---在这里执行完了--
    # inner
    import time
    def outter(f):
        def inner():
            x1 = time.time()
            f()
            x2 =time.time()
            x = x2-x1
            print("程序运行了{}秒".format(x2-x1))
        return inner
    
    @outter
    
    def func():
        time.sleep(2)
        print('我就想它执行一秒怎么滴')
    
    func()
    
    # 我就想它执行一秒怎么滴
    # 程序运行了2.0008254051208496秒
    import time
    def outter(f):
        def inner():
            x1 = time.strftime("%Y-%m-%D %X",time.localtime())
            print(x1)
            f()
            x2 = time.strftime("%Y-%m-%D %X", time.localtime())
            print(x2)
        return inner
    
    @outter
    
    def func():
        time.sleep(2)
        print('我就想它执行一秒怎么滴')
    
    func()
    #
    #2020-04-04/16/20 00:19:08
    # 我就想它执行一秒怎么滴
    # 2020-04-04/16/20 00:19:10
    # 多个装饰器原理
    
    #执行原理:先执行距离函数近的装饰器
    
    def outter1(f):
        def inner1():
            print('-----before inner1-----')
            f()
            print('--------After inner1----------')
        return inner1
    
    def outter2(f):
        def inner2():
            print('-----before inner2-----')
            f()
            print('--------After inner2----------')
        return inner2
    
    @outter1
    @outter2
    
    def func():
        print("看看什么是多个装饰器,学习学习")
    
    func()
    #
    # -----before inner1-----
    # -----before inner2-----
    # 看看什么是多个装饰器,学习学习
    # --------After inner2----------
    # --------After inner1----------
    # 带参数的装饰器
    
    def outter(f):
        def inner(*args,**kwargs):
            print(args)
            print(kwargs)
            f()
        return inner
    
    @outter
    
    def func():
        print("什么鬼,还有参数")
    
    func(10,20,name ='johnson')
    
    # (10, 20)
    # {'name': 'johnson'}
    # 什么鬼,还有参数
    def outter(f):
        def inner(a,b):
            f(a,b)
        return inner
    
    @outter   #func = outter(func)
    
    def func(a,b):
        print(a+b)
        print("什么鬼,还有参数")
    
    func(10,20)
    print(func.__name__)
    
    # 30
    # 什么鬼,还有参数
    # inner
    def outter(f):
        def inner():
            ret = f()
            return ret
        return inner
    
    @outter
    
    def func():
        print("卧槽,还有返回值")
        return "卧槽,无情"
    
    func()
    print(func())     #执行inner,inner需要有返回值才能打印,否则就是None
    
    # 卧槽,还有返回值
    # 卧槽,还有返回值
    # 卧槽,无情
    # 使用@wraps(func)解决被装饰函数的信息不能查看问题
    
    from functools import wraps
    
    def outter(f):
        @wraps(f)
        def inner(*args,**kwargs):
            f()
        return inner
    
    @outter
    def func():
        print("卧槽,还能用wraps")
    
    func(10,20,name='johnson')
    
    print(func.__name__)
    
    # 卧槽,还能用wraps
    # func
  • 相关阅读:
    windows7 dos修改mysql root密码
    Windows7 安装完成mysql dos启动服务出现服务名称无效
    windows 环境下.Net使用Redis缓存
    SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计
    Web Form 和asp.net mvc 差别
    SQL Server如何编辑超过前200行的数据
    附加数据库失败,操作系统错误 5:"5(拒绝访问。)"的解决办法
    MVC 架构
    关于打印代码
    关于WCF一些基础。
  • 原文地址:https://www.cnblogs.com/johnsonbug/p/12709776.html
Copyright © 2020-2023  润新知