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]
    不小心睡了三秒!
  • 相关阅读:
    light oj 1105 规律
    light oj 1071 dp(吃金币升级版)
    light oj 1084 线性dp
    light oj 1079 01背包
    light oj 1068 数位dp
    light oj 1219 树上贪心
    light oj 1057 状压dp TSP
    light oj 1037 状压dp
    矩阵快速幂3 k*n铺方格
    矩阵快速幂2 3*n铺方格
  • 原文地址:https://www.cnblogs.com/nulige/p/6856964.html
Copyright © 2011-2022 走看看