廖雪峰
装饰器 (@语法糖)
作用:在不改变func2的前提下,给其添加更多的功能。
普通装饰器函数
代码思路:
def func1(func):
def add_func():
# 在这里添加功能
return func()
# func 函数名
# func() 函数调用
return add_func
@func1
def fun2():
# 原来的功能
func2()
# 等价于 func1(func2)()
被装饰的函数带参数
def func1(func):
def func2(a,b): # a,b设置需要和x,y一致
print(a,b) # x,y会被传递进来
a = 1
b = 2 # a,b会被改变
return func()
return func2()
@func1
def func2(x,y):
print(x+y)
func2(10,15)
>>> 10 15
>>> 3
装饰器函数带参数
目标:实现在bad day 不出去玩,good day 出去玩。
def func():
print("bad day")
def func1():
print("bad day")
实现:
def arg_func(arg):
def _func(func):
def _func1():
if arg == 'good':
print('hang out')
if arg == 'bad':
print('stay home')
return func()
return _func1
return _func
# arg_func 装饰器函数的参数接收函数,因为装饰器函数只能是接受一个函数作为参数
# arg_func -> _func 接收装饰器函数的参数
# _func -> _func1 闭包函数 添加功能
# _func1 -> func 执行添加的功能,执行被装饰函数
@arg_func('bad'):
def func():
print("Bad day")
@arg_func('good'):
def func1():
print("Good day")
练习
请设计一个decorator
,它可作用于任何函数上,并打印该函数的执行时间:
# -*- coding: utf-8 -*-
import time, functools
def metric(fn):
def add_func(*args, **kw):
t1 = time.time()
result = fn(*args, **kw)
t2 = time.time()
print('%s executed in %s ms' % (fn.__name__, t2 - t1))
return result
return add_func
# 测试
@metric
def fast(x, y):
time.sleep(0.0012)
return x + y;
@metric
def slow(x, y, z):
time.sleep(0.1234)
return x * y * z;
f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
print('测试失败!')
elif s != 7986:
print('测试失败!')
else:
print('测试成功!')
>>> fast executed in 0.002998828887939453 ms
>>> slow executed in 0.12497758865356445 ms
>>> 测试成功!
参考:
https://www.bilibili.com/video/av25698102?from=search&seid=9430628394185842488
https://www.bilibili.com/video/av18511085/?p=25
文章最后发布于: 2019-02-16 20:53:14
相关阅读
python2,3共存:第一节:python基本概念:Python交互模式,它的提示符是>>>基本命令:exit()python基本语言:1. .py