zoukankan      html  css  js  c++  java
  • python之装饰器

    一、 什么是装饰器

      Python中的装饰器就是对函数的装饰作用,对函数的执行,做了一些装饰,比方说人还是那个人,不过做了一些打扮修饰。装饰器本身也是函数,不过它可以对别的函数进行装饰,参数必须是函数。

    二、装饰器遵循的原则:

      1、被装饰的函数不能修改:这个大家都懂,装饰器仅仅是装饰,当然不能改变原来的函数的代码(开放封闭原则),任何函数都可以用(开放),都不必关心(内部如何实现)

      2、被装饰的函数的调用方式不能改变:一样一样的,原来的函数该咋使用还得继续咋使用,不能被装饰了就变了

    三、实现原理:

      装饰器:高阶函数 + 函数嵌套 + 闭包

      听着很高深而已

      高阶函数:函数也是个对象,可以作为参数传递,还可以return返回一个函数

      函数嵌套:函数里面还可以有函数

      闭包:闭起来的包,就是局部变量

    四、有参装饰器:(就是装饰器,也可以带参数)

    import functools
    def log(text):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args,**kwargs):
                print('%s %s():' % (text, func.__name__))
                return func(*args,**kwargs)
            return wrapper
        return decorator
    
    @log('随便说点!')
    def say_hi(name, to):
        print(name + ':'+to+',h1!美女')
    
    say_hi('nulige','杨建')

    执行结果:

    随便说点! say_hi():
    nulige:杨建,h1!美女

    五、有参装饰器

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    #Author: nulige

    import functools
    import time

    def timer(func):
    """
    :param func:
    :return:
    """
    @functools.wraps(func)
    def wrapper(*args,**kwargs):
    start_time=time.time()
    res=func(*args,**kwargs)
    stop_time=time.time()
    print('函数[%s],运行时间是[%s]' %(func,stop_time-start_time))
    return res
    return wrapper


    @timer
    def sleep3s(name='nulige'):
    print(name + '要睡着了!')
    time.sleep(3)
    return '不小心睡了三秒!'

    sleep3s_str = sleep3s('nulige')
    print(sleep3s_str)

    执行结果:

    nulige要睡着了!
    函数[<function sleep3s at 0x02017030>],运行时间是[3.0003809928894043]
    不小心睡了三秒!
  • 相关阅读:
    POLARDB与其他关系型数据库对比
    美团关于分布式ID实践方案
    CRM、DMP、CDP概念解析
    TIDB简介
    美团关于分布式ID实践方案细节
    美团在TIDB方面的实践
    设计模式之桥梁模式
    【转】Hibernate和IBatis对比
    Eclipse插件安装
    【转】揭开正则表达式的神秘面纱
  • 原文地址:https://www.cnblogs.com/nulige/p/6856964.html
Copyright © 2011-2022 走看看