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]
不小心睡了三秒!

 

posted @ 2017-05-15 16:21  努力哥  阅读(300)  评论(0编辑  收藏  举报