python之路——装饰器函数

装饰器


print(time.time()) 时间戳
time.sleep(1) 停一秒
装饰器的意义:对于用户来讲 你感知不到装饰器的存在 在一个函数的前后添加功能
import time  #时间模块

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

def timer(func):
    def inner():
        start = time.time() #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)   #@timer 语法糖
def func1():
    print('in func1')


func1()
装饰器-语法糖

  装饰器的本质:一个闭包函数

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

def timer(func): #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'))
装饰器-成功hold住所有函数传参
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
装饰器格式-需要牢记、背会
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()
多个装饰器 装饰一个函数
原文地址:https://www.cnblogs.com/bsxq/p/7459974.html