【python】装饰器

1. 认识装饰器

装饰器从字面上看似乎是一个锦上添花的功能。装饰器其实是python的一个语法糖,本质还是一个函数,它接收一个函数作为参数,并返回一个函数。它可以在不改变原函数功能的基础上,对函数进行增强,添加额外的功能。

百度百科
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

2. 装饰器可用在哪些地方

  • 给函数添加计时功能
  • 对函数入参进行校验

3. 装饰器举例

需求:对函数入参进行校验

下方代码包括2个函数:

  • send_msg: 模拟向用户的手机号发送短信
  • phone_verification: 对函数send_msg的参数进行校验,校验不通过爆出异常;校验通过,正常运行函数。
import time
import re


def phone_verification(func):
    def verification(*args, **kwargs):
        # *args接收的参数是没有key=value形式的参数,例如func(1, 2, a=3),*args接收的是(1,2)
        # **kwargs接收的参数是key=value形式的参数,例如func(1, 2, a=3), **kwargs接收的是{"a": 3}
        phone = kwargs['phone']
        name = kwargs['name']
        p = re.compile('^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$')
        res = re.search(p, phone)
        if not res:
            raise ValueError("手机号码格式错误")

        if not isinstance(name, str):
            raise ValueError("名字必须是字符串")
        result = func(*args, **kwargs)
        return result
    return verification


@phone_verification
def send_msg(phone, name):
    """
    向电话号码phone发送短信
    :return:
    """
    print(f"向{name}电话号码{phone}发送短信")
    time.sleep(5)
    print(f"向{name}电话号码{phone}发送短信结束")

测试装饰器是否生效:

  • 输入正常参数:
send_msg(phone="18821708281", name="zhangsan")

从运行结果可以看出函数可以正常运行
在这里插入图片描述

  • 输入异常电话号码
send_msg(phone="10012345678", name="zhangsan")

从结果可以看出装饰器对手机号码的校验生效了。
在这里插入图片描述

  • 输出异常用户名
send_msg(phone="18812345678", name=1234)

从结果可以看出手机号验证通过了,但是名字类型输入为整型报异常了,说明装饰器参数校验是生效的。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值