装饰器
装饰器定义
-
开放封闭原则:
开放:对代码的拓展开放的,允许代码扩展、添加新功能。如更新地图,加新枪,等等。
封闭:对源码的修改是封闭的。 -
装饰器:
装饰器:完全遵循开放封闭原则。
装饰器: 在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。
装饰器就是一个函数。
装饰器的作用
- 计算函数的运行时间
- 登陆验证
普通装饰器
def decorator(f):
print("加载装饰器")
def inner():
print("开始装饰")
f()
print("装饰完毕")
print("装饰器加载完毕")
return inner
@decorator
def func():
print("我是被装饰的函数")
func()
"""
结果:
加载装饰器
装饰器加载完毕
开始装饰
我是被装饰的函数
装饰完毕
"""
带返回值的装饰器
flag = False
# 定义一个装饰器函数
def decorator(func):
def wrapper(*args, **kwargs):
print('-----》进行用户的登录验证')
r = func(*args, **kwargs)
if r:
return 'success'
else:
return 'fail'
return wrapper
def login():
global flag
username = input('输入用户名:')
password = input('输入密码:')
if username == 'admin' and password == '123':
flag = True
@decorator
def islogin():
if flag:
return True
else:
return False
# 调用login函数
login()
# 调用islogin函数
r = islogin() # islogin = wrapper
print('===>', r)
结果:
输入用户名:admin
输入密码:123
-----》进行用户的登录验证
===> success
带参数装饰器
def decorator(number): # number = 10
print('----->1')
def decorator1(func): # func = show
print('------>2')
def wrapper(*args, **kwargs):
print('--------->start')
func(*args, **kwargs)
print('--------->end')
print('-------->3')
return wrapper
print('------>4')
return decorator1
@decorator(10)
def show():
print('------》调用show函数')
show()
结果:
----->1
------>4
------>2
-------->3
--------->start
------》调用show函数
--------->end
多层装饰器
def decorator1(func):
print("decorator1")
def wrapper(*args, **kwargs):
func(*args, **kwargs) # func = house
print('铺地板')
print('刷漆')
return wrapper
def decorator2(func): # func = 第一层wrapper
print("decorator2")
def wrapper(*args, **kwargs):
func(*args, **kwargs)
print('买衣柜')
print('买沙发')
print('买电视,冰箱')
return wrapper
@decorator2
@decorator1
def house(): # house = 第二层wrapper值
print('------》毛坯房')
print(house)
house()
结果:
decorator1
decorator2
<function decorator2.< locals>.wrapper at 0x0000020B8828AE18>
------》毛坯房
铺地板
刷漆
买衣柜
买沙发
买电视,冰箱
多层装饰器的特点:
谁离原函数最近先执行哪个装饰器,将第一层装饰器的返回结果传给第二层装饰器。
匿名函数
lambda : 函数功能简单,不需要使用多次时则需要定义匿名函数
格式 : lambda [参数1-n] : 返回值(表达式)
# 这是一个函数
def add(a,b):
r = a + b
return r
# 定义为匿名函数
x = lambda a,b : a+b
r = x(5,2)
print(r)
高阶函数
- sorted()
- map()
- reduce()
- filter()
functools
functools模块
reduce()
partial() 偏函数
偏函数(Partial function)是通过将一个函数的部分参数预先绑定为某些值,
从而得到一个新的具有较少可变参数的函数。
from functools import partial, wraps
def add(x, y):
return x + y
add1 = partial(add, 3)
r = add1(9)
print(r) # 默认已经传入了一个3 所以输出为12
int1 = partial(int, base=8)
print(int1('123')) # 已经固定了int里面的base = 8,所以输入进去数字会返回8进制表示 ---》83
wraps() : 消除装饰器带来的一些副作用
获取对象名:
house.__ name__ —> 获取函数名
house.__ doc__ —> 获取文档注释
Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),
为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用