Python之装饰器复习

一、什么是装饰器?

       装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。


二、强调装饰器的原则:

1 不修改被装饰对象的源代码

2 不修改被装饰对象的调用方式

3:在遵循1和2的前提下,为被装饰对象添加上新功能

 

三、装饰器的使用:

import time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print('run time is %s' %(stop_time-start_time))
        return res
    return wrapper

@timmer         # 相当于 foo = timmer(foo)
def foo():
    time.sleep(3)
    print('from foo')
foo()
无参数的装饰器
def add(adds):     #新增一个参数,接收装饰器传来的值
    def decor(func):   
        print(adds)    
        def inner(*arg , **kw):      
            print('我是函数decor')
            result = func(*arg , **kw)  
            print(adds)        #打印装饰器中的值
            return result         
        return inner    
    return decor     #闭包

# @decor  show = decor(show)
@add('我是新加的参数adds')     #相当于返回decor函数,return decor

def show(*arg , **kw):
    print('我是函数show')
    print('我是函数show中的参数name:',arg,'我是函数show中的参数age:',kw)
    return '我是函数show中的返回值'

ret= show(*'xiaobo' , **{'zidian':25})     #*把'xiaobo'转换为元组 ,**把字典传进去
print(ret)
带参数的装饰器
def decor(func):
    def inner(name,age):
        print('我是decor')        # 在函数之前执行的功能
        return func(name,age)    # 被装饰的函数
    return inner

@decor
def show(name , age):
    print('我是函数show')
    print('我是函数show中的参数name:',name,'我是函数show中的参数age:',age)
    return '我是函数show中的返回值'
show('alex',20)
被修饰的函数需要参数

 

posted @ 2019-01-16 16:46  rayh  阅读(196)  评论(0编辑  收藏  举报