Python学习:装饰器

本节内容只有装饰器

装饰器的本质:

  1.一个闭包函数

  2.在不修改原函数及其调用方式的情况下对原函数功能进行扩展

 无参装饰器

import time

def func1():
    print('in func1')

def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

func1 = timer(func1)
func1()
一个计算代码引用时长的装饰器
import time
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

@timer   #==> func1 = timer(func1)
def func1():
    print('in func1')


func1()
简单用法—语法糖

 有参装饰器

def timer(func):
    def inner(a):
        start = time.time()
        func(a)
        print(time.time() - start)
    return inner

@timer
def func1(a):
    print(a)

func1(1)
有参数的装饰器
import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func1 = timer(func1)
def func1(a,b):
    print('in func1')

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func1('aaaaaa','bbbbbb')
print(func2('aaaaaa'))
万金油装饰器
import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func2('aaaaaa','bbbbbb')
print(func2('aaaaaa'))
带返回值的装饰器

开放封闭原则:

  1.对扩展开放:在不改变原函数的前提下添加新功能,新拓展。

  2.对修改封闭:不修改原函数,因为可能原函数可能已经给别人用了,所以不能修改。

装饰器标准类型:

    

def timer(func):
    def inner(*args,**kwargs):
        '''执行函数之前要做的'''
        re = func(*args,**kwargs)
        '''执行函数之后要做的'''
        return re
    return inner
标准装饰器—背熟

带参数的装饰器:

  通过改变全局变量的来控制装饰器的开关。

F=Flase
def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(F)
def func():
    print(111)

func()
带参数的装饰器

多个装饰器装饰同一个函数:

  给同一个函数装多个装饰器,顺序从最贴近原函数的装饰器,层层往上装饰。

 

def wrapper1(func):
    def inner():
        print('wrapper1 ,before func')
        func()
        print('wrapper1 ,after func')
    return inner

def wrapper2(func):
    def inner():
        print('wrapper2 ,before func')
        func()
        print('wrapper2 ,after func')
    return inner

@wrapper2
@wrapper1
def f():
    print('in f')

f()
多个装饰器装饰

总结:

  略

posted @ 2017-07-30 16:12  最咸的咸鱼  阅读(143)  评论(0)    收藏  举报