目录
一、概述
a. 用于管理和增强函数和类的行为
b. 提供一种在函数或类定义中插入自动运行代码的机制
c.特点:
更明确的语法
更高的代码可维护性
更好的一致性
二、编写
a. 函数基础
将函数赋给变量
将函数作为参数来传递
def add(x,y):
print(x+y)
def action(x,y,func):
return func(x,y)
action(1,2,add)
action(1,2,lambda x,y:print(x+y)) #匿名函数作参数
action1 = add #将函数赋给变量(委托函数)
action1(1,2)
3
3
3
函数嵌套及跨域访问
def action():
def add(x,y):
print(x+y)
return add
action()(1,2)
#有括号是返回函数的执行结果,没有括号是返回一个函数对象
3
def func_1():
x = 10
def func_2():
x = 20
print(x)
return func_2()
func_1()
可见,在上述程序中,func_2()函数使用的是自身函数内的变量x而非外层变量。若想使用外层变量,则要用nonloacl声明
def func_1():
x = 10
def func_2():
nonlocal x
print(x)
return func_2()
func_1()
10
b. 函数定义装饰器
def p_decorator(func): #用函数定义一个装饰器
def wrapper(*args,**kwargs): #这个参数组合代表任意类型任意数量的参数
return '<p>'+func(*args,**kwargs)+'</p>'
return wrapper
@p_decorator
def get_text():
return 'hello man'
@p_decorator
def get_upper(text):
return text.upper()
if __name__ == '__main__':
print(get_text())
# html = p_decorator(get_text)
# print(html())
<p>hello man</p>
<p>WWW.BAIDU.COM</p>
c. 类定义装饰器
(在修饰类中的方法时由于self参数重复出现,易起冲突)
class P:
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
return '<p>'+self.func(*args, **kwargs)+'</p>'
@P
def get_upper(text):
return text.upper()
if __name__ == '__main__':
print(get_upper('www.baidu.com'))
<p>WWW.BAIDU.COM</p>
d. 参数化装饰器
让装饰器更具有通用性
def tags(tag):
def tag_decorator(func):
def wrapper(*args, **kwargs):
return f'<{tag}>{func(*args, **kwargs)}</{tag}>'
return wrapper
return tag_decorator
# def div_decorator(func):
# def wrapper(*args, **kwargs):
# return '<div>{}</div>'.format(func(*args, **kwargs))
# return wrapper
@tags('div')
@tags('p') #优先内侧修饰器
def get_upper(text):
return text.upper()
if __name__ == '__main__':
print(get_upper('www.baidu.com'))
<div><p>WWW.BAIDU.COM</p></div>