【Pyhton 】 装饰器
# -*- coding:utf8 -*-
# Author : Mr·Yang
'''
装饰器,带参数装饰器,装饰器中带参数
'''
import time
# 普通装饰器
'''
def time_decor(func):
def wrapper():
star_time = time.time()
func()
down_time = time.time()
print("总耗时为", down_time - star_time)
return wrapper
@time_decor
def wait():
time.sleep(2)
if __name__ == '__main__':
wait()
'''
# 被装饰函数带参数
'''
def time_decor(func):
def wrapper(name):
star_time = time.time()
func(name)
down_time = time.time()
print("总耗时为", down_time - star_time)
return wrapper
@time_decor
def wait(name):
print("这是{}带参数的装饰器".format(name))
time.sleep(2)
if __name__ == '__main__':
name = "yanglei"
wait(name)
# 带参数的装饰器
def time_decor(cond):
def external(func):
def wrapper():
if cond == "True":
star_time = time.time()
func()
down_time = time.time()
print("总耗时为", down_time - star_time)
else:
print("\033[31;1m这是啥也没干的\033[0m")
func()
return wrapper
return external
@time_decor(cond="False")
def wait():
time.sleep(2)
if __name__ == '__main__':
wait()
# 装饰器和被装饰函数都带参数
def time_decor(cond):
def external(func):
def wrapper(*args, **kwargs):
if cond == "True":
star_time = time.time()
func(*args, **kwargs)
down_time = time.time()
print("总耗时为", down_time - star_time)
else:
print("\033[31;1m这是啥也没干的\033[0m")
func()
return wrapper
return external
@time_decor(cond="True")
def wait(*args, **kwargs):
print(len(args))
if len(args) > 1:
time.sleep(2)
if args[0]==1:
print(123)
else:
print(args)
if __name__ == '__main__':
name, age, sun = 1, 2, 3
wait(name, age, sun)
# 被装饰函数带返回值
def time_decor(func):
def wrapper(*args, **kwargs):
if func(*args, **kwargs) == None:
print("没有返回值的函数对象")
else:
print("带返回值的函数对象")
res = func(*args, **kwargs)
return res
return wrapper
@time_decor
def wait(*args, **kwargs):
sun = args[0]+args[1]
return sun
if __name__ == '__main__':
x = 111
y = 222
a = wait(x,y)
print(a)
'''
#
def time_decor(func):
def wrapper():
start_time = time.time()
func()
down_time = time.time()
return wrapper
import threading
import time
def time_out(timer):
'''
一个规定函数执行时间的装饰器
:param timer:
:return:
'''
def wrapper(func):
def __wrapper():
start_time = time.time()
# 通过设置守护线程强制规定函数的运行时间
t = threading.Thread(target=func)
t.setDaemon(True)
t.start()
time.sleep(timer)
if t.is_alive():
# 若在规定的运行时间未结束守护进程,则主动抛出异常
raise Exception('Function execution timeout')
print (time.time()-start_time)
return __wrapper
return wrapper
@time_out(50)
def timer():
time.sleep(10)
timer()
【Pyhton 】 装饰器的更多相关文章
- day30 Pyhton 面向对象 继承.装饰器
一面向对象相关 谈谈你对面向对象的理解 1.泛泛谈:什么情况下使用面向对象 2.针对面向对象的 封装 继承 多态一个一个的谈 3.根据你工作中的实际情况对应来举例子 封装 1.广义上:普遍的大家认为的 ...
- Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇
一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- python装饰器
今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- [原创]django+ldap实现单点登录(装饰器和缓存)
前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- python cookbook 学习系列(一) python中的装饰器
简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...
- python基础补漏-05-生成器和装饰器
[1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...
随机推荐
- Python_PyQt5_eric6 做省市县筛选框
eric是PyQt5的图形化编辑工具,界面如下(另存为-桌面 查看大图) 下面是用eric6制作的 省市县 三级联动筛选框 (效果图+源码) 1 # -*- coding: utf-8 -*- 2 ...
- Oracle表和表空间查询
用户查询 查询和用户相关的数据 创建用户 CREATE USER user IDENTIFIED BY password [DEFAULT TABLESPACE tablespace] [TEMPOR ...
- 如何使用GitHub创建Maven私有仓库
[Github上创建仓库] 首先,在GitHub上创建自己的仓库(mvn-repo): [配置本地setting文件] 找到本地的maven settings文件,配置server: 有两种选择,可以 ...
- 关于Java多线程看这一篇就够了,从创建线程到线程池分析的明明白白
前言 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,即进程空间或(虚空间).进程不依赖于线程而独立存在,一个进程中可以启动多个线程. 线程是指进程中的一个执行流程,一个进程中可 ...
- 史上最全!2020面试阿里,字节跳动90%被问到的JVM面试题(附答案)
前言:最近老是收到小伙伴的私信问我能不能帮忙整理出一份JVM相关的面试题出来,说自己在大厂去面试的时候这一块问的是特别多的,每次自己学的时候每次都学不到重点去.这不他来了,一份详细的JVM面试真题给大 ...
- FL Studio采样设置之时间拉伸栏
今天小编将带领大家了解一下FL Studio采样设置页面中的时间拉伸栏知识,该栏目包含了和采样音频的时间拉伸相关的设置.其右边是一个时间伸缩方式下拉列表,里面列出了很多种类的伸缩方式,自动方式是默认的 ...
- 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...
- C语言讲义——链表的实现
节点(结构体描述) struct Node { int _id; char s[50]; struct Node* pre;// 指向前一个节点的地址 struct Node* next;// 指向下 ...
- CentOS7系统tab命令补全
在新安装的CentOS7系统中,如果没有安装命令补全的话,在systemctl管理服务的时候就没法用tab来自动补全,因此在安装完系统后,我们要再安装命令补全这个软件: yum -y install ...
- 深圳-2020-java面试题分享
记录一下最近面试接触的面试题. 深圳掌众传媒: union 和union all区别 union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: union All:对两个结果集进行 ...