python装饰器基本使用

文章目录

  • 前言
  • 一、装饰器
    • 1.1 用途
  • 二、不带参数
  • 三、带参数
  • 四、带信息的装饰器
  • 五、类装饰器


前言

工作过程中使用到装饰器完成业务功能,本文主要总结下自己对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')

你可能感兴趣的:(#,python基础,python,开发语言)