zoukankan      html  css  js  c++  java
  • 函数进阶(装饰器)

    装饰器

    python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:

    • 实质: 是一个函数
    • 参数:是你要装饰的函数名(并非函数调用
    • 返回:是装饰完的函数名(也非函数调用
    • 作用:为已经存在的对象添加额外的功能
    • 特点:不需要对对象做任何的代码上的变动

    python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事务处理、权限校验等。装饰器是解决这类问题的绝佳设计。并且从引入中的列子中我们也可以归纳出:装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑

    # 这是最原始的装饰器
    import time        #时间模块
    def timmer(func):
        def inner():
            start_time = time.time()
            time.sleep(0.1)
            func()
            end_time = time.time()
            print("==========%s==========="%(end_time-start_time))
        return inner
    
    def func():
        print("你们好")
    f = timmer(func)
    f()
    #运行结果:

    你们好
    ==========0.1000056266784668===========

    import time
    
    def decorator(func):
        def wrapper(*args, **kwargs):
            start_time = time.time()
            func()
            end_time = time.time()
            print(end_time - start_time)
    
        return wrapper
    
    @decorator
    def func():
        time.sleep(0.8)
    func() # 函数调用

    #运行结果:

    0.8000459671020508

    
    

     

    完整的装饰器(万能装饰器)
    概念
    开放封闭原则
    开放:他对扩展是开放的
    封闭:他对修改是封闭的
    装饰器使用的就是开放 封闭原则

    #装饰器的固定结构
    
    def wrapper(func):
        def inner(*args,**kwargs):
            ''' 被装饰函数执行之前添加的代码'''
            ret = func(*args,**kwargs)
            ''' 被装饰函数执行之后添加的代码'''
            return ret
        return inner
    
    
    @wrapper
    def fun1(a,b):
        print(a+b)
    fun1(1,2)

      

    装饰器小例子

    # def login():
    #     username = input('用户名:')
    #     password = input('密码:')
    #     if username == 'alex' and password == 'somebody':
    #         print('登录成功')
    
    
    # def art():
    #     print('欢迎来到文章页')
    #
    # def dar():
    #     print('欢迎来到日记页')
    #用装饰器来实现,访问art或者dar函数,登录一次后无需再登录  

    函数:

    flag = False
    
    def login(func):
        def inner(*args,**kwargs):
            global flag
            if flag == False:
                username = input('用户名:')
                password = input('密码:')
                if username == 'alex' and password == 'somebody':
                    print('登录成功')
                    flag = True
            if flag == True:
                ret = func(*args,**kwargs)
                return ret
        return inner
    @login
    def art():
        print('欢迎来到文章页')
    
    
    @login
    def dar():
        print('欢迎来到日记页')
    
    art()
    dar()
    

      

     类装饰器以及装饰器链   https://www.cnblogs.com/lianyingteng/p/7743876.html

     

      

  • 相关阅读:
    MySQL用户管理
    MySQL函数
    MySQL数据类型
    MySQL配置
    PowerDesigner之PDM检查
    PowerDesigner之PDM(物理概念模型)
    .NET Reflector反编译的方法
    IBatis.net 输出SQL语句(七)
    SVN 记录冲突、忽略
    SQLServer 窗口函数
  • 原文地址:https://www.cnblogs.com/mainstream/p/11030949.html
Copyright © 2011-2022 走看看