Python 装饰器的三种用法及使用示例


前言

装饰器的作用主要是在不影响函数逻辑的情况下,扩展其某个常用功能,常用于为函数添加事件记录。
例如当需要给创建的所有函数在调用时都添加日志功能,就可以统一使用装饰器功能来方便的进行日志记录,同时当需求更改时很方便的进行统一更改,请查看如下示例:


装饰器三种用法包括:不带参数的装饰器、带参数的装饰器、创建装饰器类

# -------------------------------------------------------------------------------------------------
# 不带参数的装饰器示例
# -------------------------------------------------------------------------------------------------
# """
def logAction(fun1):
    '''Function log docorator'''

    def wrapFunction():
        print('the function {} is called'.format(fun1.__name__))
        fun1()
        print('Function compeleted')

    return wrapFunction


@logAction  # 1、注意:此处@符号后面直接写的logAction后面并不带参数,所以程序在此处并未执行log action,而是返回logAction到MyFun1
def MyFun1():  # 2、程序运行到此处时实际是执行的logAction()函数,返回WrapFunction
    print('Hi')


@logAction
def Myfun2():
    print('Hello world')


# 打印MyFun1的名称,输出结果显示其名称其实已经被WrapFunction代替了,但是在装饰器里的Fun1名称显示的是调用的函数名称
print(MyFun1.__name__)
print(logAction.__doc__)
MyFun1()  # 3、程序在此处执行的为wrapFunction()函数
Myfun2()


# """

# -------------------------------------------------------------------------------------------------
# 带参数的装饰器示例(装饰器带参数,调用函数带参数)
# -------------------------------------------------------------------------------------------------
# """
def logAction(LogDate=2022):
    '''Function log docorator'''

    def logdecorator(func):
        def wrapFunction(*args, **kwargs):
            print('{}:the function {} is called'.format(LogDate, func.__name__))
            func(*args, **kwargs)
            print('Function compeleted')
            # return func

        return wrapFunction

    return logdecorator


@logAction(20220711)  # 1、注意:此处的参数及括号是根据装饰器的嵌套层数来决定的,当程序运行到此处时直接运行logAction()返回logdecorator
def MyFun3(username='Mary'):  # 2、程序运行到此处时将执行logdecorator()函数,返回wrapFunction
    print('Hi' + username)


@logAction(20220712)
def Myfun4(username='Tom'):
    print('Hello' + username)


MyFun3('Joke')  # 3、在此处运行MyFun3实际上是运行的WrapFunction()
Myfun4('pitt')


# """

# -------------------------------------------------------------------------------------------------
# 装饰器类
# -------------------------------------------------------------------------------------------------
# """
class logger():
    def __init__(self, logdate=20220712):
        self.logDate = logdate

    def __call__(self, func):
        def wrapFunction(*args, **kwargs):
            print('{}:the function {} is called'.format(self.logDate, func.__name__))
            func(*args, **kwargs)
            print('Function compeleted')
            # return func

        return wrapFunction


@logger(20220713)  # 1、注意:程序运行到此处时将创建logger实例并执行初始化
def MyFun3(username='Mary'):  # 2、程序运行到此处时将执行__call__函数,同时返回wrapFunction
    print('Hi' + username)


@logger(20220713)
def Myfun4(username='Tom'):
    print('Hello' + username)


MyFun3('Joke')  # 3、在此处执行MyFun3时实际执行的是wrapFunction()函数
Myfun4('pitt')
# """





总结

1、装饰器主要起函数简化及扩展辅助功能,在某种情况下可以函数的补充
2、注意装饰器的用法格式及创建装饰器类需要的魔法方法
3、利用python编辑器调试断点功能可以查看装饰器执行时如何跳转的语句及执行步骤

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值