1、函数的高级应用及装饰器
1、1:函数的基础:
装饰器:概述:用于挂你和增强函数和类行为的代码!,提供了一种在函数或类定义中插入自动运行代码的机制。
特点:1、更加明确的语法 2、更好的代码可维护性 3、更好的一致性。
在前面的课程中已经讲过了!函数的基础!可以去看看!
2、2:自定义装饰器类:两种第一模式:第一种函数定义装饰器类,第二种是类定义装饰器类
1、 函数定义装饰器类:
#coding=gbk
"""
函数定义装饰器decorator
"""
#需求:要对het_text这个函数返回的结果做一个修饰,在两头加上一个标签
#定义装饰器 将需要装饰的函数当做参数传递到装饰器中,
def p_decorator(func):
def wrapper(*args,**kwargs):
return '<p>'+ func(*args,**kwargs)+'</p>'
return wrapper
#这个@符号表示的是:使用这个装饰器函数来装饰get_text这个函数。
# @p_decorator #这是第一种写法
def get_text():
return '好好学习python'
if __name__ == '__main__':
# print(get_text()) 第一种装饰器类的调用方法,就是加@装饰器的调用方法。
html = p_decorator(get_text) #第二种调用方式。
print(html())
这是使用函数来定义装饰器。两个方式的调用。 通常习惯用第一种。用函数定义的装饰器,即可以用在普通的函数上,也可以用在类里面定义的方法上。
2、3:使用类定义装饰器:
#coding=gbk
"""
类定义装饰器
"""
#定义装饰器类
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 '努力学习python知识。'
@P
def get_upper_text(text):
return text.upper()
if __name__ == '__main__':
print(get_text())
print(get_upper_text('www.baidu.com'))
上面的例子是,通过类定义装饰器,可以用在脚本里面的普通的函数上!但是用到另外的类的函数上!就会出现问题!下面我们测试一下。 会报错:TypeError: get_name() missing 1 required positional argument: 'self' 。说少了一个石self的参数: 原因是因为:在我们在定义装饰器的时候,用到了一个参数叫self,当传一个学生实例的时候,他的get_name()也有一个self参数,这样就起冲突了!如何解决呢!?能解决!但是不方便!所以在开发的时候我们需要选择如何定义装饰器! 个人建议始终使用函数来定义装饰器类。
2、4:参数化装饰器:
#coding=gbk
"""
函数定义装饰器decorator
"""
#需求:如果有很多的标签需要加的话!每一次都要定义太麻烦了!
#所以我们定义参数化的装饰器
#定义参数化装饰器 ,就是在外面多一层函数。
def tags(tag):
def tag_decorator(func):
def wrapper(*args,**kwargs):
return '<{}>{}</{}>'.format(tag,func(*args,**kwargs),tag)
return wrapper
return tag_decorator
def p_decorator(func):
def wrapper(*args,**kwargs):
return '<p>'+ func(*args,**kwargs)+'</p>'
return wrapper
@tags('div')
@tags('p')
def get_text():
return '好好学习python'
if __name__ == '__main__':
print(get_text())
def tags这个函数就是定义的参数装饰器