linux中的加法函数,上下文管理练习(为加法函数计时)

上下文管理(为加法函数计时)

为加法函数计时

使用装饰器显示该函数的执行时长

使用上下文管理显示该函数的执行时长

装饰器实现

import time

import datetime

from functools import wraps

def logger(fn):

@wraps(fn) # wraps(fn)(wrapper)

def wrapper(*args, **kw):

start = datetime.datetime.now()

ret = fn(*args, **kw)

delta = (datetime.datetime.now() - start).total_seconds()

print(delta)

return ret

return wrapper

@logger

def add(x, y):

time.sleep(2)

return x + y

上下文实现

最简单实现

3c8ce6380daa33c267ccb0e2e66a02de.png

增加__call__用法

import time

import datetime

class TimeIt:

def __init__(self, fn):

self.fn = fn

def __enter__(self):

self.start = datetime.datetime.now()

return self

def __exit__(self, exc_type, exc_val, exc_tb):

self.delta = (datetime.datetime.now() - self.start).total_seconds()

print(self.delta)

def __call__(self, *args, **kwargs):

ret = self.fn(*args, **kwargs)

return ret

def add(x, y):

""" This is add"""

time.sleep(2)

return x + y

with TimeIt(add) as foo:

print(foo(3,4))

3c8ce6380daa33c267ccb0e2e66a02de.png

需要增加初始化方法,为下面__call__使用

__enter__方法返回self是为了,有了__call__方法以后,可以这样使用with TimeIt(add) as foo: foo(3,4)

因为有了__call__后,实例变成可调用,而foo就是实例化后的实例

TimeIt(add)是将add函数名作为形参传进去

改成装饰器

import time

import datetime

class TimeIt:

def __init__(self, fn):

self.fn = fn

def __enter__(self):

self.start = datetime.datetime.now()

return self

def __exit__(self, exc_type, exc_val, exc_tb):

self.delta = (datetime.datetime.now() - self.start).total_seconds()

print(self.delta)

def __call__(self, *args, **kwargs):

print('call')

ret = self.fn(*args, **kwargs)

return ret

@TimeIt # add = TimeIt(add)

def add(x, y):

""" This is add"""

time.sleep(2)

return x + y

# 上下文用法

# with TimeIt(add) as foo:

# print(foo(3,4))

print(add(5,6))

print(add.__doc__)

print(add.__dict__)

print(add.__name__)

3c8ce6380daa33c267ccb0e2e66a02de.png

3c8ce6380daa33c267ccb0e2e66a02de.png

装饰器用法很简单,直接在add函数上加个@TimeIt

这是由于@TimeIt等价于add = TimeIt(add),把add函数名作为实参传入到TimeIt类中

就相当于为add函数加了一个类封装的功能或属性

而这个时候,我们发现,用装饰器实现后,直接走的是__call__方法中的语句块,而上下文没有执行(因为没有用with..as语句)

也就是说,要么用with..as语句,要么用装饰器方法,这是两个方法

(用with..as语句执行装饰器方法,这样比较繁琐,重复计算,因题而异)

但是,如何解决文档字符串的问题,怎么把add函数的配置信息也弄过来(看__doc__和__dict__就可以知道)

解决文档字符串问题

方法1

把函数对象的文档字符串赋给类

class TimeIt:

def __init__(self, fn):

self.fn = fn

self.__doc__ = self.fn.__doc__

self.__name__ = self.fn.__name__

self.__dict__ = self.fn.__dict__

方法2

使用functools.wraps函数

最终完整版

import time

import datetime

from functools import wraps

class TimeIt:

"""This is Class"""

def __init__(self, fn):

self.fn = fn

# 把函数对象的文档字符串赋给类

# self.__doc__ = self.fn.__doc__

# self.__name__ = self.fn.__name__

# @wraps = wraps(fn)(wrapper)

wraps(fn)(self) # wraps用法

# def __enter__(self):

# self.start = datetime.datetime.now()

# return self

# def __exit__(self, exc_type, exc_val, exc_tb):

# self.delta = (datetime.datetime.now() - self.start).total_seconds()

# print(self.delta)

def __call__(self, *args, **kwargs):

print('call')

self.start = datetime.datetime.now()

ret = self.fn(*args, **kwargs)

delta = (datetime.datetime.now() - self.start).total_seconds()

print(delta)

return ret

@TimeIt # add = TimeIt(add)

def add(x, y):

""" This is add"""

time.sleep(2)

return x + y

# 上下文用法

# with TimeIt(add) as foo:

# print(foo(3,4))

print(add(5,6))

print(add.__doc__)

print(add.__dict__)

print(add.__name__)

print(type(add))

3c8ce6380daa33c267ccb0e2e66a02de.png

3c8ce6380daa33c267ccb0e2e66a02de.png

第15行的用法wraps(fn)(self)是根据这个@wraps = wraps(fn)(wrapper)来的

@wraps是带参装饰器,fn就是带参,wrapper是传入的实参

简单来说,@wraps = wraps(fn)(wrapper)就是把fn的配置信息赋值给wrapper

所以wraps(fn)(self)就是把fn的配置信息赋值给实例(self就是实例化后的实例)

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88584

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07数组与接口

1、运行TextInherists.java 示例,观察输出,注意总结父类与子类之间构造方法的的调用关系,修改parent构造方法的代码,显式调用grandparent另一个构造函数。 源代码: class GrandParent{ public GrandParent(){ System.o…

windows 访问linux中的mongodb,MongoDB的linux系统下的安装与连接

一 安装MongoDB的服务下载Linux系统下的MongoDB安装包上传压缩包到linux服务器中,解压到对应的安装目录下mkdir /usr/local/mongodbtar -zxvf mongodb-linux-x86_64-4.0.10.tgzmv mongodb-linux-x86_64-4.0.10 /usr/local/mongodb新建目录,分别用来存储数…

像阿超那样,花20分钟写一个能自动生成小心四则运算题目的 “软件”,要求:除了整数以外,还要支持真分数的四则运算。 和同学们比较一下各自程序的功能,实现方法的异同,等等...

package chapter;public class szys { public static void main(String[] args) { print30Questions(); } private static void print30Questions() { //说明:打印30道题函数,把接收到的题目字符串按照指定格式输出。…

linux sqlserver 管理工具,Linux连接SqlServer的图形化工具SQuirrel

SQuirrel SQL一款基于java的数据库管理工具。所以可以运行在任意平台上,除了界面丑一点。在windows上我绝对不会选的,navicat多好。安装下载地址:https://sourceforge.net/projects/squirrel-sql/?sourcetyp_redirect在控制台运行&#xff1…

【转】C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.

// 复制数据至剪切板BOOL CopyToClipboard(const char* pszData, const int nDataLen){ if(::OpenClipboard(NULL)) { ::EmptyClipboard(); HGLOBAL clipbuffer; char *buffer; clipbuffer ::GlobalAlloc(GMEM_DDESHARE, nDataLen1); …

linux中sort命令实例,Linux命令之排序命令sort使用实例

名称:sort位置:/usr/bin/sort权限:所有用户用法: sort [OPTION]... [FILE]...sort [OPTION]... --files0-fromF选项:-b --ignore-leading-blanks 忽略最前面的空格-f --ignore-case fold lower case to…

JDK源码包结构分类

最近查看JDK源码时,无意间发现几个类在陌生包里:com.sun.*、sun.*、org.*,google了一把总结了下以备他人搜索,如内容有误欢迎指正!Jre库包含的jar文件(jdk1.6):resources.jar、rt.jar、jsse.jar、jce.jar、…

linux帮助命令和用法,Linux命令帮助及history命令的使用

1.Linux命令帮助的获取详解在Linux中获取命令帮助时&#xff0c;内部命令和外部命令的获取方式是有区别的&#xff1a;即(1)内部命令&#xff1a;#help COMMAND? #man bash(2)外部命令&#xff1a;<1> # COMMAND --help# COMMAND -h<2> 使用手册(manu…

GJM :Sql 各种语句 以及函数 [转载]

版权声明&#xff1a;本文原创发表于 【请点击连接前往】 &#xff0c;未经作者同意必须保留此段声明&#xff01;如有侵权请联系我删帖处理&#xff01;1.更改数据库的名称 2.表中有数据的情况下再添加列、删除列 3.在SQLServer 中各种查询语句的使用示例 4.模糊查询的语句 5.…

linux中断处理体系结构分析(一),Linux中断处理体系结构分析(二)

1.中断处理的体系结构我们知道编写设备驱动程序一定要用到中断处理函数&#xff0c;这在驱动程序的编写中&#xff0c;占据很重要的一部分。在响应一个特定的中断的时候&#xff0c;内核会执行一个函数&#xff0c;该函数叫做中断处理程序(interrupt handler)或中断服务例程(in…

c语言作业题五六章答案,数据结构(C语言版)第五六章习题答案

数据结构(C语言版)第五六章习题答案,人民邮电出版社,答案很详细。(15)设F是一个森林&#xff0c;B是由F变换得的二叉树。若F中有n个非终端结点&#xff0c;则B中右指针域为空的结点有( )个。A&#xff0e; n-1 B&#xff0e;n C&#xff0e; n1 D&#xff0e; n22&#xff0e;应…

福州大学c语言考试答案,C语言练习模拟考福州大学工程技术学院.doc

C语言练习模拟考福州大学工程技术学院.doc1 课程课程 专业专业 姓名姓名 学号学号 总评成绩总评成绩 一、单选题一、单选题将将正确正确选项选项的的字母字母填在填在答题答题纸纸上上。每小题。每小题 1 1 分&#xff0c;共分&#xff0c;共 2 25 5 分分) ) 1 1在计算机上可以…

Android中土司(Toast)的使用

Android中Toast的使用 什么是土司(Toast)? Toast是Android系统提供的一种非常好的提示方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何的屏幕空间. 下面我们通过代码来体验一下土司在Android中的使用 1 import android.a…

atoll找不到标识符c语言,C/C++编程笔记:C++中的atol,atoll和atof函数

1、atol()此函数将作为参数传递给函数调用的C类型字符串转换为长整数。它解析C字符串str&#xff0c;将其内容解释为整数&#xff0c;并作为long int类型的值返回。该函数丢弃出现在字符串开头的空白字符&#xff0c;直到找到非空白字符为止。如果C字符串str中的非空白字符序列…

cvc个人记录[为了方便以后查看]

1、摄中拍是需要要求的&#xff0c;图像帧数太快不能进行摄中拍

c语言文件压缩与解压缩实验报告,哈弗曼树的文件压缩和解压实验报告(C语言).doc...

Lab05 树结构的应用学号&#xff1a; 姓名&#xff1a; 实验时间&#xff1a;2011.5.241.问题描述哈弗曼树的编码与译码— 功能&#xff1a;实现对任何类型文件的压缩与解码— 输入&#xff1a;源文件&#xff0c;压缩文件— 输出&#xff1a;解码正确性判定&#xff0c;统计压…

android基础知识之一

1:Android系统架构&#xff08;重点&#xff09; 分层的架构 JNI java native interface   1.application :应用层 &#xff1b; java   2.application framework :应用框架层 &#xff0c; java&#xff2a;&#xff2e;&#xff29;   3.libraries 和 dalvik &#xf…

HT68F30控制5150 IIC控制总线

1、关于应答信号的一点知识 数据传输与应答信号ACK 发送到SDA线上的数据必须是8位的。每次传输可以发送的数据不受限制。每个字节后必须在时钟的第9个脉冲期间释放数据总线&#xff08;SDA为高&#xff09;&#xff0c; 由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成…

c语言指针改良,重新认识C语言指针(上)(示例代码)

? 独创性并不是首次观察某种新事物&#xff0c;而是把旧的、很早就是已知的&#xff0c;或者是人人都视而不见的事物当新事物观察&#xff0c;这才证明是有真正的独创头脑 —尼采本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。https://github.com/midou-tech/article…

centos安装Python2.7

1. 查看本机系统及python版本 # cat /etc/redhat-release CentOS release 6.7 (Final) 查看CentOS release 6.7 (Final)自带的python版本 # python -VPython 2.6.6 注意&#xff0c; 我们不要破坏系统的Python环境&#xff0c; 因为几个关键的实用应用程序依赖于系统默认的Pyth…