zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    PowerShell尝试ssh登录
    PowerShell收发TCP消息包
    powershell对指定IP进行端口扫描
    PowerShell尝试登录ftp
    PowerShell批量扫描IP和端口
    《PowerShell 3.0 Advanced Admin handbook》已于今日上市
    PowerShell尝试登录SQL Server
    Docker 数据卷
    Dockerfile自定义镜像
    Docker 容器操作
  • 原文地址:https://www.cnblogs.com/yunlong-study/p/13502788.html
Copyright © 2011-2022 走看看