Python自学笔记(15day)

装饰器

(1)装饰器的原则:开放封闭原则

   开放:对扩展是开放的

  封闭:对修改是封闭的

(2)装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后添加功能

装饰器的分类

(1)不含有返回值return的装饰器

import time 
def func():
    time.sleep(0.01)
    print("帅哥")

def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
    def inner():             #定义一个闭包函数inner()
        start=timer.timer()
        f()
        end=time.time()
        print(end-start)
    return inner

func=timmer(func)      #返回的是闭包函数的函数名字
func()

(2)含有返回值return的装饰器

import time
def func():
    time.sleep(0.01)
    print("帅哥")
    return "王然"

def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
    def inner():             #定义一个闭包函数inner()
        start=timer.timer()
        ret=f()             #调用f()拿到返回值赋值给ret
        end=time.time()
        print(end-start)
        return ret          #将ret返回给闭包函数
    return inner

func=timmer(func)      #返回的是闭包函数的函数名字
print(func())           #func()拿到返回值"王然"

#被装饰的函数有返回值return时,这时候在调用fun(),执行闭包函数打印出来,闭包函数本身没
#有返回值,打印就会出错,所以加一个返回值,返回的是被装饰函数的返回值,用变量ret代替,
#再闭包函数中,func()赋值给ret

(3)带有一个参数的装饰器

import time
def func(a):
    time.sleep(0.01)
    print("帅哥",a)
    return "王然"

def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
    def inner(a):             #定义一个闭包函数inner()
        start=timer.timer()
        ret=f(a)             #调用f()拿到返回值赋值给ret
        end=time.time()
        print(end-start)
        return ret          #将ret返回给闭包函数
    return inner

func=timmer(func)      #返回的是闭包函数的函数名字
print(func(a))           #func()拿到返回值"王然"

#当被装饰函数有参数时,调用func(),也必须加一个参数,但是实际上func()是执行闭包函数,
#所以inner(a)也要加上参数,里面的f(a)也要加上参数

(4)带有多参数与混合参数的装饰器

import time
def func(*args,**kwargs):
    time.sleep(0.01)
    print("帅哥",a)
    return "王然"

def timmer(f):               #装饰器函数,timmer装饰器函数函数名字
    def inner(*args,**kwargs):             #定义一个闭包函数inner()
        start=timer.timer()
        ret=f(*args,**kwargs)             #调用f()拿到返回值赋值给ret
        end=time.time()
        print(end-start)
        return ret          #将ret返回给闭包函数
    return inner

func=timmer(func)      #返回的是闭包函数的函数名字
print(func(1,a=2))           #func()拿到返回值"王然"

总结:装饰器固定格式

def wrapper(f):            #定义一个装饰器函数,wrapper装饰器函数名,f被装饰函数名
    def inner(*args,**kwargs):              #定义闭包函数,出传入参数
        """在被装饰函数之前要做的事情"""
        ret=f(*args,**kwargs)            #被装饰函数赋值
        """在被装饰之后做的事情"""
        return ret
    return inner                     #返回闭包函数函数名给装饰器函数

@wrapper               #等价于列子中的 func=wrapper(f):得到闭包函数函数名字
def func(*args,**kwargs):   #被装饰的函数
    pass
func(*args,**kwargs) #调用被装饰函数,其实相当于执行@wrapper():执行闭包函数

 

posted @ 2018-09-22 22:27  诺诺诺亚索隆  阅读(207)  评论(0编辑  收藏  举报