python装饰器基本使用


前言

工作过程中使用到装饰器完成业务功能,本文主要总结下自己对python装饰器的一些理解


提示:以下是本篇文章正文内容,下面案例可供参考

一、装饰器

1.1 用途

在不更改函数前提下拓展函数的功能,从而使自己的代码更简洁可读性高。且如果一个函数被多个装饰器修饰则从里到外执行装饰器函数

二、不带参数

import datetime
def outFunc(func):
    def innerFunc():
    	start = datetime.datetime.now()
        func()
        end = datetime.datetime.now()
        print(func.__name__,"方法执行耗时:",end - start)
    return innerFunc
@outFunc    
def test():
    print('a')
test()

三、带参数

被装饰的函数若存在的参数,则只需要在装饰函数内函数中传入可变参数即可

mport datetime
import time
def outFunc(func):
    def innerFunc(*args,**kwargs):
        start = datetime.datetime.now()
        func(*args,**kwargs)
        end = datetime.datetime.now()
        print(end-start)
    return innerFunc
@outFunc
def test(a):
    print('开始执行')
    time.sleep(2)
    print(a)
    print('结束执行')
test('monica')

四、带信息的装饰器

此类装饰与之前装饰区别就在于外层在套一层函数,且该类装饰器可实现日志输出功能,通过传入的日志等级输出对应的日志内容

def wrapper(msg):
    def outFunc(func):
        def innerFunc(*args,**kwargs):
            func(*args,**kwargs)
            if msg=='msg':
            	print("{0}执行".format(msg))
        return innerFunc
    return outFunc 
@wrapper(msg='test')
def test(a):
    print(a)

五、类装饰器

无参数的类装饰器,重写__call__方法
# -*- coding: UTF-8 -*-
import datetime
import time
class Decorators():
    def __init__(self,func):
        self.func = func
    def __call__(self, *args, **kwargs):
        startTime = datetime.datetime.now()
        self.func()
        endTime = datetime.datetime.now()
        print(endTime-startTime)
@Decorators
def test():
    print('开始执行函数')
    time.sleep(3)
    print('执行结束')
test()
1.有参数的类装饰器,init方法接收参数,call方法接收装饰函数,执行装饰逻辑
2.若是要装饰一个类中的函数与装饰单个函数方法相同
class Decorators():
    def __init__(self,level=None):
        self.level = level

    def __call__(self,func):
        def inner(*args,**kwargs):
            print("[{level}]: the function {func}() is running...".format(level=self.level, func=func.__name__))
            func(*args,**kwargs)
        return inner

@Decorators(level='info')
def test(name):
    print('开始执行')
    print(name,'2222')
    print('执行结束')
test('monica')

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值