简介:
装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。
1.装饰器的基本使用
# 注意程序运行步骤 def decorator(func): # 这里的参数func其实就是foo函数 def inner(): print("1.程序第一步执行到这里") func() # 这里的func函数其实就是foo函数 print('3.这是inner函数') return inner def foo(): print('2.这是foo函数') foo = decorator(foo) foo()
2.不带参数的装饰器
def decorator(func): # 这里的参数func其实就是foo函数 def inner(): func_name = func.__name__ print("1.程序第一步执行到这里,执行函数名称:",func_name) func() print("3.程序最后运行到这里") print("----------------------------------------------") return inner @decorator # foo = decorator(foo) def foo(): print('2.foo..') @decorator # doo = decorator(doo) def doo(): print('2.doo..') foo() doo()
3.带参数的被装饰的函数
def decorator(func): def inner(a, b): func_name = func.__name__ print("1.程序第一步执行到这里,执行函数名称:", func_name) func(a, b) print("3.程序最后运行到这里") print("----------------------------------------------") return inner @decorator # add = decorator(addnum) # 实现两数相加操作 def addnum(num1, num2): print("2.两数相加结果:",num1 + num2) @decorator # subnum = decorator(subnum) # 实现两数相减操作 def subnum(num1, num2): print("2.两数相减结果:",num1 - num2) addnum(10, 5) subnum(10, 5)
4.带参数的被装饰的函数和装饰器
def decorator_arg(flag=0): def decorator(func): def inner(a, b): func_name = func.__name__ print("1.程序第一步执行到这里,执行函数名称:", func_name) func(a, b) print("3.程序运行到这里") if flag: print("4.传递给装饰器的参数为:",flag) print("----------------------------------------------") return inner return decorator @decorator_arg(2) # add = decorator(addnum) # 实现两数相加操作 def addnum(num1, num2): print("2.两数相加结果:",num1 + num2) @decorator_arg(2) # subnum = decorator(subnum) # 实现两数相减操作 def subnum(num1, num2): print("2.两数相减结果:",num1 - num2) addnum(10, 5) subnum(10, 5)
5.python装饰器总结
def decorator_name(*args,**kwargs): # 定义装饰器,可能带参数 def decorator(func): # 装饰器核心,以被装饰的函数对象为参数,返回装饰后的函数对象 def inner(*args, **kvargs): # 装饰的过程,参数列表适应不同参数的函数 pass # 修改函数调用前的行为 func(*args, **kvargs) # 调用函数 pass # 修改函数调用后的行为 return inner return decorator @decorator_name() # 给函数加上装饰器 def funcname(参数): pass # 自己定义的函数体
文章转载:https://www.cnblogs.com/xingxingnbsp/p/11684216.html