首页 > 编程语言 >python踩坑: 装饰器类的局部缓冲值

python踩坑: 装饰器类的局部缓冲值

时间:2023-07-14 16:56:20浏览次数:36  
标签:count 器类 python self filename __ fps time 缓冲值

test.py:

# coding: utf8
import time
import threading
import functools


class MyThread(threading.Thread):
    def __init__(self, filename, fps):
        self.filename = filename
        self.fps = fps
        super().__init__()

    def run(self):
        print(f"filename: {self.filename}, fps: {self.fps}")
        time.sleep(1)


class MyDecorator:
    def __init__(self, filename_prefix, fps):
        self.filename = f"temp/{filename_prefix}_{time.time()}.log"
        self.fps = fps

    def __call__(self, func):
        def wrap(*args, **kwargs):
            thread = MyThread(filename=self.filename, fps=self.fps)
            thread.start()

            func(*args, **kwargs)

            thread.join()

        return wrap


def my_decorator(**kwargs):
    def outer(func):
        @functools.wraps(func)
        def inner(self):
            prefix = kwargs.get("prefix")
            filename = f"temp/{prefix}_{time.time()}.log"
            fps = kwargs.get("fps")

            thread = MyThread(filename=filename, fps=fps)
            thread.start()

            func(self)

            thread.join()

        return inner

    return outer


class Test:

    @MyDecorator(filename_prefix="process", fps=18)
    def process(self):
        for i in range(3):
            time.sleep(1)
            print("count:", i)

    @my_decorator(prefix="fun2", fps=18)
    def fun2(self):
        print("function 2")

    @MyDecorator(filename_prefix="process2", fps=18)
    def process2(self):
        for i in range(3):
            time.sleep(1)
            print("count:", i)


if __name__ == '__main__':
    obj = Test()
    obj.process()
    obj.fun2()
    obj.process2()
    print("==================")

    time.sleep(2)

    obj2 = Test()
    obj2.process()
    obj2.fun2()
    obj2.process2()

执行结果:

filename: temp/process_1689323409.5417378.log, fps: 18
count: 0
count: 1
count: 2
filename: temp/fun2_1689323412.567841.log, fps: 18
function 2

filename: temp/process2_1689323409.5417378.log, fps: 18
count: 0
count: 1
count: 2
==================
filename: temp/process_1689323409.5417378.log, fps: 18
count: 0
count: 1
count: 2
filename: temp/fun2_1689323421.6333349.log, fps: 18
function 2

filename: temp/process2_1689323409.5417378.log, fps: 18
count: 0
count: 1
count: 2

问题描述:

  1. 重复调用被装饰器类装饰的任意函数时,会自动使用第一次调用装饰器类时产生的局部缓冲值,例如:time.time()
  2. 使用装饰器函数不存在使用缓冲值的现象。

总结:
如非特别要求,尽可能使用装饰器函数,避免使用装饰器类。

标签:count,器类,python,self,filename,__,fps,time,缓冲值
From: https://www.cnblogs.com/hello-littlebaby/p/17554213.html

相关文章

  • python 时间
    目录时间Python日期和时间python中时间日期格式化符号:获取某月日历Time模块日历(Calendar)模块其他相关模块和函数时间Python日期和时间#Python程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。#Python提供了一个time和calendar模块可以用于格式化日期......
  • python 推导式
    目录python推导式列表推导式字典推导式集合推导式python推导式列表推导式#!/usr/bin/envpython#-*-coding:utf-8-*-#BY:wenchao.Litime:2021/7/12#列表推导式格式:[表达式for变量in旧列表]或者[表达式for变量in旧列表if条件]#旧列表》》新列表......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-7-浏览器的相关操作
    1.简介上一篇已经将playwright的元素定位大法基本介绍的差不多了,但是在Web的UI自动化的测试中,我们通常需要使用一些方法来操作浏览器,今天就跟随学习了解一下。这一篇宏哥主要是介绍一下,在自动化测试的时候,我们常见的一些浏览器操作有哪些,宏哥将会一一介绍和讲解。2.层级在介绍......
  • centos7.8安装Python-3.10
    centos7.8安装Python-3.10一.安装opensslpython3.10需要openssl至少1.1.1,而centos7.8默认版本为1.0.2*参考:https://www.cnblogs.com/linagcheng/p/15870060.html 二.安装依赖yuminstall-ybzip2-devellibffi-develzlibzlib-devel 三.安装Python-3.10tar-zx......
  • Python如何实现自动生成报表并以邮件发送
    Python如何实现自动生成报表并以邮件发送首先来介绍下实现自动报表要使用到的Python库:pymysql一个可以连接MySQL实例并且实现增删改查功能的库datetimePython标准库中自带的关于时间的库openpyxl一个可以读写07版以后的Excel文档(.xlsx格式也支持)的库smtplibSMTP即简单......
  • python之数据库:SQL注入问题,视图,触发器,事务,存储过程,函数,流程控制,索引,慢查询
    SQL注入问题(了解现象)importpymysql#连接MySQL服务端conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='db8_3',charset='utf8',autocommit=True#......
  • python中import和import...from的区别
    今天遇到一个奇怪的问题,如下面的代码:importtkinterastkfromtkinterimportsimpledialogdefpopup():user_input=tk.simpledialog.askstring("输入对话框","请输入你的名字:")ifuser_inputisnotNone:print("你的名字是:",user_input)......
  • python中None与Null的区别
    None是一个对象,而NULL是一个类型。Python中没有NULL,只有None,None有自己的特殊类型NoneType。None不等于0、任何空字符串、False等。在Python中,None、False、0、""(空字符串)、、()(空元组)、(空字典)都相当于False。  ......
  • python ModuleNotFoundError: No module named 'flask'
    问题:pip安装了模块,提示Nomodulenamed解决方法:1.先看看模块列表里是否安装好了:piplist模块名2.看看模块安装路径:pipshow模块名3.多个版本的Python,看看pip把包安装到哪个版本的lib/python3.8/site-packages路径下1)先确认命令指向的版本:一般是在/usr/bin/下......
  • python 获取加载模块路径
    方法一:python3-c"importsys;print(sys.path)"效果:方法二:python3importsysprint(sys.path)效果:参考:https://www.zhihu.com/question/603263580?utm_id=0......