廖雪峰[009]

装饰器 (@语法糖)

作用:在不改变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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值