装饰器(Decorators)是Python的一个重要部分,相信大多初学者难以理解,这里会分享装饰器具体的一些用法
定义
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
装饰器实际上就是一个闭包,把一个函数当做函数参数传入,然后返回一个替代版函数,本质上就是一个返回函数的高阶函数
简单的装饰器
有一个功能函数now(),主要作用是打印日期,现在想要在不改变now()的前提下增加一些功能,比如在日期的上一行打印一排“*”。这时候就可以用到装饰器啦,具体实现代码如下:
def outer(func):
def inner():
print("*********")
return func()
return inner
@outer
def now():
print("2019-06-13")
now()
从上面的代码我们可以知道装饰器的一个语法,如下:
def outer(func):
def inner():
#增强的功能
#在内函数中执行func函数
return func()
return inner
@outer
def func():
函数体
在装饰器中,分为外函数(outer)与内函数(inner)
外函数(outer):
1.将被装饰的函数(func)传递进来
2.将装饰好的函数(inner)返回给调用者
内函数(inner):
1.添加动态增加的功能
2.执行被装饰的函数
内函数中return什么时候可以省略?
注意:当被装饰的函数没有返回值的时候,内函数的return可以省略;若被装饰的函数中存在返回值,则内函数的return则不能省略。
@的功能:将被装饰的函数的函数名作为参数传递给外函数,将外函数返回的替代版的函数赋值给原本的函数。
带参数的装饰器
装饰器允许传入参数,具体语法如下:
def outer(func):
def inner(参数列表):
#添加增加的功能
return func(参数列表)
return inner
@outer
def func(参数列表):
函数体
注意:
1.使用内函数来接收被装饰函数的参数
2.调用被装饰的函数的时候,需要将参数传递进去。
案例1:使用装饰器,给getAge函数添加一个对年龄的限制,年龄[0,160]
def getAge(age):
print("您的年龄为%d" % age)
具体实现代码如下:
def outer(func):
def inner(age):
if age >= 0 and age <= 160:
func(age)
else:
print("年龄有误")
return inner
@outer
def getAge(age):
print("您的年龄为%d" % age)
getAge(100) #您的年龄为100
getAge(200) #年龄有误
案例2:使用装饰器,给getMoney函数添加一个对金额的限制:1.必须全是数字 2.必须大于0
def getMoney(mon):
return int(mon)
具体实现代码如下:
def moneydec(func):
def inner(mon):
if mon.isdecimal():
return func(mon)
else:
print("金额有误")
return inner
@moneydec
def getMoney(mon):
return int(mon)
print(getMoney("123"))
print(getMoney("-123"))
print(getMoney("xyz"))
运行结果如下:
123
金额有误
None
金额有误
None