装饰器
装饰器的编写在函数基础上
作用和特点
用于管理和增强函数和类行为的代码
提供一种在函数或类定义中插入自动运行代码的机制
特点:语法明确、代码维护性高、一致性更好
相关基础知识——函数基础
def add(a,b):
return a+b
def subtract(a,b):
return a-b
def action(x,y,func):
return func(x,y)
#放函数最后一个func是add而不是add()
print(action(3,1,add))
print(action(3,1,lambda x,y:x*y))
嵌套
def greeting():
def hello():
return 'Hello'
return hello()
print(greeting())
def greeting():
def hello():
return 'Hello'
return hello
## 返回函数对象没执行
print(greeting())
## 再加括号返回执行结果
print(greeting()())
跨域访问
LEGB:local本地,封装,global全局,内部
def func_1():
x = 10
def func_2():
x = 20
return x + 10
return func_2()
## 使用func_2作用域本地变量
print(func_1())
def func_1():
x = 10
def func_2():
# 不使用当前的x使用外层封装的x变量
nonlocal x
return x + 10
return func_2()
#使用func_1变量
print(func_1())
装饰器
函数定义装饰器
既可用在函数上,也可以用在类的方法上
'''函数定义装饰器'''
##类似html = '<p>hello</p></div>'
def p_decorator(func):
# 对func进行修改或封装
# 代表所有参数*args所有元组单个参数,**kwargs一大堆有名字的参数
def wrapper(*args,**kwargs):
# 原样执行返回,函数嵌套
return '<p>' + func(*args,**kwargs) +'</p>'
# 返回函数对象
return wrapper
#修饰get_text
@p_decorator
def get_text():
return 'hello 2019'
if __name__ == '__main__':
print(get_text())
'''函数定义装饰器'''
def p_decorator(func):
# 对func进行修改或封装
# 代表所有参数*args所有元组单个参数,**kwargs一大堆有名字的参数
def wrapper(*args,**kwargs):
# 原样执行返回,函数嵌套
return '<p>' + func(*args,**kwargs) +'</p>'
# 返回函数对象
return wrapper
def get_text():
return 'hello 2019'
if __name__ == '__main__':
html = p_decorator(get_text)
print(html())
类定义装饰器
'''类定义装饰器'''
class P:
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
return '<p>' + self.func(*args,**kwargs) + '</p>'
@P
def get_text():
return 'hello 2019'
@P
def get_upper_text(text):
return text.upper()
if __name__ == '__main__':
print(get_text())
print(get_upper_text('aaa'))
用在类的方法上搞不懂是哪个self会报错
'''类定义装饰器'''
class P:
def __init__(self,func):
self.func = func
def __call__(self, *args, **kwargs):
return '<p>' + self.func(*args,**kwargs) + '</p>'
class Student:
def __init__(self,name):
self.name = name
@P
def get_name(self):
return self.name.upper()
@P
def get_text():
return 'hello 2019'
@P
def get_upper_text(text):
return text.upper()
if __name__ == '__main__':
print(get_text())
print(get_upper_text('aaa'))
s = Student('Mike')
print(s.get_name())
参数化装饰器
'''参数化装饰器'''
def tags(tag):
def tag_decorator(func):
def wrapper(*args,**kwargs):
return f'<{tag}>{func(*args,**kwargs)}<{tag}>'
return wrapper
return tag_decorator
def p_decorator(func):
# 对func进行修改或封装
# 代表所有参数
def wrapper(*args,**kwargs):
return '<p>' + func(*args,**kwargs) +'</p>'
# 返回函数对象
return wrapper
def div_decorator(func):
def wrapper(*args,**kwargs):
return '<div>{}<div>'.format(func(*args,**kwargs))
return wrapper
@p_decorator
def get_text():
return 'hello 2019'
# 先修饰p,后修饰div
# @div_decorator
# @p_decorator
@tags('div')
@tags('p')
def get_upper_text(text):
return text.upper()
if __name__ == '__main__':
print(get_upper_text('www'))