• Python3 装饰器无参有参 Egon老师视频


    # 一:储备知识
    #1、 *args, **kwargs
    # def index(x,y):
    # print(x,y)
    #
    #
    # def wrapper(*args,**kwargs):
    # index(*args,**kwargs) #
    # # index(y=222,x=111)
    # wrapper(y=222,x=111)


    # 2、名称空间与作用域:名称空间的的"嵌套"关系是在函数定义阶段,即检测语法的时候确定的

    # 3、函数对象:
    # 可以把函数当做参数传入
    # 可以把函数当做返回值返回
    # def index():
    # return 123
    #
    # def foo(func):
    # return func
    #
    # foo(index)

    # 4、函数的嵌套定义:
    # def outter(func):
    # def wrapper():
    # pass
    # return wrapper


    # 闭包函数
    # def outter():
    # x=111
    # def wrapper():
    # x
    # return wrapper
    #
    # f=outter()

    #二 装饰器
    """
    1、什么是装饰器
    器指的是工具,可以定义成成函数
    装饰指的是为其他事物添加额外的东西点缀

    合到一起的解释:
    装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能


    2、为何要用装饰器
    开放封闭原则
    开放:指的是对拓展功能是开放的
    封闭:指的是对修改源代码是封闭的

    装饰器就是在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能
    3、如何用

    总结无参装饰器模板
    # def outter(func):
    # def wrapper(*args,**kwargs):
    # # 1、调用原函数
    # # 2、为其增加新功能
    # res=func(*args,**kwargs)
    # return res
    # return wrapper

    作业

    import time
    from functools import wraps
    
    
    def outter(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            start = time.time()
            res = 0
    
            while 1 > 0:
                name = input("username is:").strip()
                pwd = input("password is ").strip()
                while (time.time() - start) < 20:
                    if name == "yun" and pwd == "123":
                        time.sleep(20)
                        res = func(*args, **kwargs)
                    else:
                        print("ipunt wrong")
                    end = time.time()
                    print('run tiem is %f'%(end - start))
            return res
    
        return wrapper
    
    @outter #index = outter(index) ==> index = wrapper
    def index(x,y,z):
        print("%s %s %s"%(x,y,z))
    
    
        
    index(1,2,3)
    print(index.__repr__())

    # 一:知识储备
    # 由于语法糖@的限制,outter函数只能有一个参数,并且该才是只用来接收
    # 被装饰对象的内存地址
    # def outter(func):
    # # func = 函数的内存地址
    # def wrapper(*args,**kwargs):
    # res=func(*args,**kwargs)
    # return res
    # return wrapper
    #
    # # @outter # index=outter(index) # index=>wrapper
    # @outter # outter(index)
    # def index(x,y):
    # print(x,y)

    # 偷梁换柱之后
    # index的参数什么样子,wrapper的参数就应该什么样子
    # index的返回值什么样子,wrapper的返回值就应该什么样子
    # index的属性什么样子,wrapper的属性就应该什么样子==》from functools import wraps

    # 语法糖
    def auth(db_type):
    def deco(func):
    def wrapper(*args, **kwargs):
    name = input('your name>>>: ').strip()
    pwd = input('your password>>>: ').strip()

    if db_type == 'file':
    print('基于文件的验证')
    if name == 'egon' and pwd == '123':
    res = func(*args, **kwargs) # index(1,2)
    return res
    else:
    print('user or password error')
    elif db_type == 'mysql':
    print('基于mysql的验证')
    elif db_type == 'ldap':
    print('基于ldap的验证')
    else:
    print('不支持该db_type')
    return wrapper
    return deco


    @auth(db_type='file') # @deco # index=deco(index) # index=wrapper
    def index(x, y):
    print('index->>%s:%s' % (x, y))

    @auth(db_type='mysql') # @deco # home=deco(home) # home=wrapper
    def home(name):
    print('home->>%s' % name)


    @auth(db_type='ldap') # 账号密码的来源是ldap
    def transfer():
    print('transfer')

    # index(1, 2)
    # home('egon')
    # transfer()


    # 有参装饰器模板
    def 有参装饰器(x,y,z):
    def outter(func):
    def wrapper(*args, **kwargs):
    res = func(*args, **kwargs)
    return res
    return wrapper
    return outter

    @有参装饰器(1,y=2,z=3)
    def 被装饰对象():
    pass

    作业:编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定

    import time
    #time.strftime('%Y-%m-%d %X')
    
    path = input("文件路径:").strip()
    def zuiz(file_path):
        def outter(func):
            def f1_w(*args, **kwargs):
                with open(file_path, 'w') as f:
                    f.write(time.strftime('%Y-%m-%d %X'))
                res = func(*args, **kwargs)
                return res
            return f1_w
        return outter
    
    @zuiz(path)
    def index(x,y,z):
        print("%s %s %s"%(x,y,z))
        return 1
    
    index(1,2,3)
  • 相关阅读:
    一、上网行为管理基本操作
    tp5的自动加载机制,自动加载了哪些文件?
    tp5的执行流程
    tp5的助手函数--文件位置,以及助手函数原理和列表
    tp5中中,五个渲染函数,view,fetch,display,render,show五者的区别和联系
    tp5模板中的冒号是什么意思?具体能冒号那些函数呢?吗的,为什么网上都没有这样的回答?
    fastadmin的登陆逻辑是怎样的?会员模块,能不能移植到cms插件中,主要是界面上的整合。
    js 如何访问跨域的iframe的元素
    thinkphp5框架加载流程
    leetcode——1391.检查网格中是否存在有效路径
  • 原文地址:https://www.cnblogs.com/yunlong-study/p/13502788.html
Copyright © 2020-2023  润新知