码迷,mamicode.com
首页 > 编程语言 > 详细

python -- 装饰器

时间:2019-07-23 00:32:25      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:重新定义   记录   modify   day   函数名   添加   Fix   rom   prefix   

一、装饰器(Decorator)

装饰器本质上也是一个函数,它可以为已设计好的函数增加额外的功能。

装饰器的定义与普通函数的定义在形式上是类似的。

不同的是装饰器必须传入一个函数对象作为参数,然后在装饰器中重新定义一个新的函数

在这个函数中执行新增的操作,并对应的位置调用被装饰的函数。最后返回这个新定义的函数。

既可以为多个函数添加同一个装饰器,也可以给一个函数添加多个装饰器。

如果被装饰的函数带有参数,装饰器中的函数也需要添加相同数量的参数。

无法确定具体的参数时,可以在装饰器函数中使用不定长参数。(*args, **kwargs) 元组&字典格式传入

 

from datetime import date


# -------------------------------------------
# 装饰器(Decorator):给已设计好的函数增加额外的功能
# -------------------------------------------
# func:被装饰的函数名
# inner:装饰完的函数名
def prefix(func):
# 装饰器函数
def inner(): #这里是装饰器新定义的函数,原来的功能
print("今天的日期是:")
return func() #返回的是today()函数的内容
return inner


@prefix #添加新的功能,保持原有的函数名不变,today是在原有装饰器上被装饰的函数
def today():
print(date.today())


# today = prefix(today)
today() # 由于有装饰器,执行debug后,单个执行会跳转到innner()函数中;与函数today()名相同,调用today函数


# -----------------------------------
# 给多个函数添加相同的装饰器
# -----------------------------------
def add_confirm(func):
def confirm():
print("您确认要执行下面的操作吗:")
return func()
return confirm


@add_confirm
def f1():
print(‘新增记录‘)


@add_confirm
def f2():
print(‘删除记录‘)


@add_confirm
def f3():
print(‘修改记录‘)


f1()
f2()
f3()

print()


# --------------------------------
# 被装饰函数具有相同的参数个数
# --------------------------------
def add_confirm1(func):
# 传入相应长度的参数列表
def confirm(arg):
print("您确认要执行下面的操作吗:")
return func(arg)
return confirm


@add_confirm1
def fun1(arg1):
print(‘新增记录:‘, arg1)


@add_confirm1
def fun2(arg1):
print(‘删除记录:‘, arg1)


@add_confirm1
def fun3(arg1):
print(‘修改记录:‘, arg1)


fun1(1005)
fun2(1003)
fun3(1002)
print()


# --------------------------------
# 被装饰函数具有不同的参数个数
# --------------------------------
def add_confirm2(func):
# 传入不定长参数
def confirm(*args, **kwargs):
print("您确认要执行下面的操作吗:")
return func(*args, **kwargs)
return confirm


@add_confirm2
def func1(arg1):
print(‘新增记录:{}‘.format(arg1))


@add_confirm2
def func2(arg1, arg2):
print(‘删除记录:{}、{}‘.format(arg1, arg2))


@add_confirm2
def func3(arg1, arg2, arg3):
print(‘修改记录:{}、{}、{}‘.format(arg1, arg2, arg3))


func1(1009)
func2(1005, 1006)
func3(1001, 1002, 1003)
print()


# --------------------------------
# 给一个函数增加多个装饰器
# --------------------------------
def confirm_operate(func):
def confirm(*args, **kwargs):
print("您确认要执行下面的操作吗?")
return func(*args, **kwargs)

return confirm


def confirm_data(func):
def confirm(*args, **kwargs):
print("您确认数据是正确的吗?")
return func(*args, **kwargs)

return confirm


@confirm_operate
@confirm_data
def modify(arg1):
print("修改数据:", arg1)


modify(1006)

python -- 装饰器

标签:重新定义   记录   modify   day   函数名   添加   Fix   rom   prefix   

原文地址:https://www.cnblogs.com/Teachertao/p/11229220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!