Python学习第十三天---函数的高级应用及装饰器

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这个函数就是定义的参数装饰器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值