简介:

  装饰器(Decorators)是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。

1.装饰器的基本使用

Python 装饰器_函数对象

# 注意程序运行步骤
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()

Python 装饰器_函数对象

 2.不带参数的装饰器

Python 装饰器_函数对象

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()

Python 装饰器_函数对象


3.带参数的被装饰的函数

Python 装饰器_函数对象

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)

Python 装饰器_函数对象


4.带参数的被装饰的函数和装饰器

Python 装饰器_函数对象

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)

Python 装饰器_函数对象


5.python装饰器总结

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 # 自己定义的函数体

Python 装饰器_函数对象