1、简单定义
装饰器:允许向一个现有的对象添加新的功能,同时又不改变其结构。(遵循开放封闭原则)
特点:只要使用装饰器,就是拿函数地址作为参数。并且要有闭包的特点。
2、单层装饰函数(不带参数)
#定义一个装饰器
def decorate(func):
def wrapper():
func()
print('---刷漆---')
print('---铺地板---')
return wrapper
@decorate
def house():
print('我是毛胚房....')
house()
#输出结果为:
我是毛胚房....
---刷漆---
---铺地板---
执行过程:
- house函数被装饰
- 将被装饰函数house作为参数传给装饰器decorate
- 执行decorate函数
- 将返回值又赋值给house,最后执行house函数。
3、多层装饰函数(不带参数)
#装饰器一
def zhuang1(func):
def wrapper():
func()
print('---刷漆---')
return wrapper
#装饰器二
def zhuang2(func):
def wrapper():
func()
print('---铺地板---')
return wrapper
@zhuang2
@zhuang1 #先装
def house():
print('我是毛胚房')
house()
#输出结果是:
我是毛胚房
---刷漆---
---铺地板---
总结: 如果装饰器是多层的,谁距离函数近就优先执行。
4、带参数装饰器
#装饰器带参数
def outer(n): #第一层负责接受装饰器的参数
def decorate(func): #第二层负责接受函数
def wrapper(*args,**kwargs): #第三层负责接收函数的参数
func(*args,**kwargs)
print('----》铺地板砖头{}块'.format(n))
return wrapper
return decorate
@outer(10)
def house(time):
print('我{}日期拿到房子的钥匙,是毛胚房...'.format(time))
house('5月')
#输出结果为:
我5月日期拿到房子的钥匙,是毛胚房...
----》铺地板砖头10块
带有参数的装饰器,装饰器是三层函数。
- 第一层负责接受装饰器的参数。
- 第二层负责接受函数。
- 第三层负责接受函数的参数。其中形参为*args,**kwargs可以说此装饰器为万能装饰器。
5、开发实例
#示例:开发,登录验证
import time
#定义一个登录函数
def login():
username = input('输入用户名:')
password = input('输入密码:')
if username == 'admin' and password == '123456':
return True
else:
return False
islogin = False
#定义一个装饰器,进行付款验证
def login_required(func):
def wrapper(*args,**kwargs):
global islogin
print('-------付款---------')
#验证用户是否登录
if islogin:
func(*args,**kwargs)
else:
print('用户没有登录,不能付款。')
#跳转到登录页面
islogin = login()
print('结果是:',islogin)
return wrapper
@login_required
def pay(money):
print('正在付款,付款金额是:{}元'.format(money))
print('付款中')
time.sleep(2)
print('付款完成!')
pay(1000)
pay(8000)
输出结果为: