一、函数装饰器:
在代码运行期间,可以动态增加函数功能的方式,被称为装饰器【Decorator】
也就是说,在不修改原函数的基础上,给原函数增加功能
好处:在团队开发中,如果两个或者两个以上的程序员会用到相同的功能,但是功能又有细微的差别,采用装饰器:相互不影响,代码简化
1.简单装饰器:
def test():
print("拼搏到无能为力,坚持到感动自己")
#a.书写闭包
#b.给外部函数设置参数,fun表示的是原函数
def outer(fun):
def inner():
# d.给原函数增加功能
print("hello")
#c.调用原函数
fun()
return inner
#e.使用闭包
f = outer(test) #f = inner
f() #inner()
# 运行结果:
# hello
# 拼搏到无能为力,坚持到感动自己
#注意:增加的功能可以写在原函数调用的前面或者后面
#注意:outer函数就被称为装饰器
2.有参装饰器:
# 原函数
def getAge(age):
print(age)
# 装饰器
def wrapper(fun):
#注意:当原函数有参数,装饰器的作用是为了操作原函数中的参数,给inner设置参数
def inner(num):
#增加新功能:过滤负数
if num < 0:
num = 0
#调用原函数
fun(num) #age = num
return inner
f = wrapper(getAge)
f(10) #num = 10
f(-5) #num = 0
3.装饰器简写:
#简化demo2中的操作:@装饰器的名称 应用到原函数中
#需求:在不修改原函数的基础上,进行数据的过滤:当用户输入age为负数的时候,则置为0
def wrapper(fun):
#注意:当原函数有参数,装饰器的作用是为了操作原函数中的参数,给inner设置参数
def inner(num):
#增加新功能:过滤负数
if num < 0:
num = 0
#调用原函数
fun(num) #age = num
return inner
#将wrapper装饰器应用在了getAge函数上,
@wrapper
def getAge(age):
print(age)
getAge(10)
getAge(-