python3装饰器

装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能
装饰器的本质 : 闭包函数

函数的原则

开发原则: 开放封闭原则
    开放 : 对扩展是开放的
    封闭 : 对修改是封闭的

 

 

不是装饰器的装饰器

import time


def func():
    time.sleep(0.01)
    print('123')


def timmer(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print(end-start)
    return inner


func = timmer(func)	#执行装饰
func()

采用@的装饰器


import time


def timmer(f):
    def inner():
        start = time.time()
        ret=f()
        end = time.time()
        print(end-start)
        return ret
    return inner


@timmer     #相当于执行了 func=timmer(func)
def func():
    time.sleep(0.01)
    print('123')
    return 1


ret=func()
print(ret)

带输入输出的修饰器


import time


def timmer(f):
    def inner(a):
        start = time.time()
        ret=f(a)
        end = time.time()
        print(end-start)
        return ret
    return inner


@timmer
def func(a):
    time.sleep(0.01)
    print('123')
    a=a+1
    return a


ret=func(2)
print(ret)

修饰器模板

def wrapper(func):   #func表示被修饰的函数
    def inner(*args,**kwargs):
        #函数前要执行的内容
        ret = func(*args,**kwargs)   #被装饰的函数
        #函数后要执行的内容
        return ret
    return inner

@wrapper        #执行修饰,相当于执行了qqxing = wrapper(qqxing)
def qqxing():
    print(123)

ret = qqxing()

带开关的装饰器

import time
FLAGE = True
def timmer_out(flag):
    def timmer(func):
        def inner(*args,**kwargs):
            if flag:
                start = time.time()
                ret = func(*args,**kwargs)
                end = time.time()
                print(end-start)
                return ret
            else:
                ret = func(*args, **kwargs)
                return ret
        return inner
    return timmer

@timmer_out(FLAGE)    #wahaha = timmer(wahaha)
def wahaha():
    time.sleep(0.1)
    print('wahahahahahaha')

wahaha()

多个装饰器装饰一个函数

离函数近的先装饰,在内层。

#多个装饰器装饰一个函数
def wrapper1(func):
    def inner1():
        print('wrapper1 ,before func')
        ret = func()
        print('wrapper1 ,after func')
        return ret
    return inner1

def wrapper2(func):
    def inner2():
        print('wrapper2 ,before func')
        ret = func()
        print('wrapper2 ,after func')
        return ret
    return inner2

def wrapper3(func):
    def inner3():
        print('wrapper3 ,before func')
        ret = func()
        print('wrapper3 ,after func')
        return ret
    return inner3

@wrapper3
@wrapper2
@wrapper1
def f():
    print('in f')
    return '哈哈哈'

print(f())


输出
wrapper3 ,before func
wrapper2 ,before func
wrapper1 ,before func
in f
wrapper1 ,after func
wrapper2 ,after func
wrapper3 ,after func
哈哈哈

 

展开阅读全文

没有更多推荐了,返回首页