#函数名尽量避免重复,会覆盖
-----------------------------------------------------------------------------------------------------------------------------------
原理:python的原理入下图所示,在add函数直接执行return inner, 调用add函数中的inner函数。在此inner函数中,现在执行print函数,也就是你要在 f1 函数中额外"添加"的内容,再执行 f1 函数。而 f1函数是通过add中的参数传入的,是f1函数的地址。
def add(function):
def inner():
print('增加的内容')
function()
return inner
def f1():
print('--f1--')
def f2():
print('--f2--')
f1 = add(f1)
f1()#输出为 f1+增加的内容
---------------装饰器(上图和下图是一样的,上图是装饰器的原理)--------------------------------------------
def add(function):
def inner():
print('增加的内容')
function()
return inner
@add
def f1():
print('--f1--')
@add
def f2():
print('--f2--')
f1()
f2()
输出:
增加的内容
--f1--
增加的内容
--f2--
----------------------------------------------------------------------------------------
多个装饰器
多个装饰器执行的顺序是从装饰器的循序有关系的,首先执行第一个再执行第二个,其中第一个中的function()不会执行。
#!usr/bin/env python
#-*- coding:utf-8 -*-
def add(function):
def inner():
print('增加的内容')
function()
return inner
def add_2(function):
def inner():
print("增加的第二条内容")
function()
return inner
@add
@add_2
def f1():
print('--f1--')
@add_2
@add
def f2():
print('--f2--')
f1()
f2()
"""
输出:
增加的内容
增加的第二条内容
--f1--
增加的第二条内容
增加的内容
--f2--
"""
装饰器的执行时间
解释器执行到装饰器就会自动的装饰,而不是等到调用的时候才装饰的
使用 装饰器对无参数的装饰器进行装饰
#!usr/bin/env python
#-*- coding:utf-8 -*-
def add(function):
def inner(a,b):
print('增加的内容')
function(a,b)
return inner
@add
def f1(a,b):
print('%d--f1--%d'%(a,b))
f1(1,2)
装饰器对带有返回值
#!usr/bin/env python
#-*- utf-8 -*-
def add(function):
def innner(a):
print('--f2--')
return function(a)
return innner
@add
def f1(a):
print('---f1---')
return a+1
print(f1(2))
通用装饰器
#!usr/bin/env python
#-*- utf-8 -*-
def add(function):
def innner(*args,**kwargs):
print('--f2--')
return function(*args,**kwargs)
return innner
@add
def f1(a):
print('---f1---')
return a+1
print(f1(2))
带有参数的装饰器
#!usr/bin/env python
#-*- utf-8 -*-
def add_arg(arg):
def add(function):
def innner(a):
print('--f2--')
return function(a)
return innner
return add
@add('add')
def f1(a):
print('---f1---')
return a+1
print(f1(2))