首页 > 编程语言 >python装饰器

python装饰器

时间:2023-03-05 16:57:49浏览次数:38  
标签:__ python sleep func time print 装饰 def

装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

一般写法:

def how_much_time(func):
    def inner():
        t_start = time.time()
        func()
        t_end = time.time()
        print("一共花费了{0}秒时间".format(t_end - t_start, ))
    return inner
    # 将增加的新功能代码以及被装饰函数运行代码func()一同打包返回,返回的是一个内部函数,这个被返回的函数就是装饰器
def sleep_5s():
    time.sleep(5)
    print("%d秒结束了" % (5,))
sleep_5s = how_much_time(sleep_5s)
sleep_5s()

语法糖写法:

def how_much_time(func):
    def inner():
        t_start = time.time()
        func()
        t_end = time.time()
        print("一共花费了{0}秒时间".format(t_end - t_start, ))
 
    return inner
 
@how_much_time
# @how_much_time等价于sleep_5s = how_much_time(sleep_5s)
def sleep_5s():
    time.sleep(5)
    print("%d秒结束了" % (5,))

sleep_5s()

2.给某个函数加上多个装饰器

2.1给一个函数添加两个装饰器

# 为函数添加一个统计运行时长的功能以及日志记录功能
import time
import threading
 
def how_much_time(func):
    print("how_much_time函数开始了")
    def inner():
        t_start = time.time()
        func()
        t_end = time.time()
        print("一共花费了{0}秒时间".format(t_end - t_start, ))
    return inner
 
def mylog(func):
    print("mylog函数开始了")
    def inner_1():
        print("start")
        func()
        print("end")
    return inner_1
 
@mylog
@how_much_time
# 等价于mylog(how_much_time(sleep_5s))
def sleep_5s():
    time.sleep(5)
    print("%d秒结束了" % (5,))
 
if __name__ == '__main__':
    sleep_5s()
#how_much_time函数开始了
#mylog函数开始了
#start
#5秒结束了
#一共花费了5.012601613998413秒时间
#end

2.2当一个函数具有两个装饰器时的执行顺序

三,带参数装饰器的典型写法

 

 

四,类装饰器

        类装饰器这个写法,主要思路就是返回一个增加了新功能的函数对象,只不过这个函数对象是一个类的实例对象。由于装饰器是可调用对象,所以必须在类里面实现__call__方法,这样由类生成的各种实例加上()就可以运行了。

1,不带参数的类装饰器

import time
 
 
class Decorator:
    def __init__(self, func):
        self.func = func
 
    def defer_time(self):
        time.sleep(5)
        print("延时结束了")
 
    def __call__(self, *args, **kwargs):
        self.defer_time()
        self.func()
 
 
@Decorator
def f1():
    print("延时之后我才开始执行")
 
f1()

2,带参数的类装饰器

import time
 
class Decorator:
    def __init__(self, func):
        self.func = func
 
    def defer_time(self,time_sec):
        time.sleep(time_sec)
        print(f"{time_sec}s延时结束了")
 
    def __call__(self, time):
        self.defer_time(time)
        self.func()
 
@Decorator
def f1():
    print("延时之后我才开始执行")
 
f1(5)

 

标签:__,python,sleep,func,time,print,装饰,def
From: https://www.cnblogs.com/Frank-guo/p/17180839.html

相关文章

  • 在线图书借阅网站( Python +Vue 实现)
    功能介绍平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括:首页、图书详情页、用户中心......
  • python 循环结构 for循环 输出1到100的数值
    """for循环语法:foriinrange(起点包含,终点不包含):要重复做的事情"""foriinrange(1,101):print(i)......
  • python 循环结构 for循环遍历列表 输出所有列表成员
    """for临时变量in列表:处理临时变量"""li=["刘备","关羽","张飞"]print("准备欢迎每个同学")fornameinli:print(name,"你好")......
  • Python基础
    1.机器语言、汇编语言、编译型、解释型语言子在执行效率、开发效率、跨平台性方面的高低对比。答:执行效率:机器语言>汇编语言>编译型语言>解释性语言;开发效率:机器语言<汇编......
  • python 分支结构 循环结构 while循环 输出3次pyhui
    """定义计数器while条件:需要重复做的事情计数器变化"""#计数器i=0#循环whilei<3:print("pyhui")i+=1#结束print("over")......
  • Python元组类型的内置方法
    一、元组类型内置方法(tuple)元组是不可变的列表,即元组的值不可更改,因此元组一般只用于只存不取的需求。也因此元组可以被列表取代掉,所以元组相比较列表使用的很少。元组相......
  • Python网络编程server端和client端代码
    #client端代码importsocketclient=socket.socket()client.connect(('127.0.0.1',3999))whileTrue:content=input('>>>')client.send(bytes(content,'ut......
  • 使用Python开发端口扫描检测工具
    fromsocketimport*importtimestartTime=time.time()target=input('需要扫描的主机:')t_IP=gethostbyname(target)print('开始扫描主机:',t_IP)......
  • Python数据分析之财政收入影响因素分析及预测模型
    numpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsinputfile='C:/Users/justaplayer/Desktop/data.csv'#输入的数据文......
  • python--turtle
    前言就随便练练,学习一下turtle库的使用正文 1.语法学习import turtle                    #导入库turtle.showturtle()   ......