# -*- 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 】 装饰器的更多相关文章

  1. day30 Pyhton 面向对象 继承.装饰器

    一面向对象相关 谈谈你对面向对象的理解 1.泛泛谈:什么情况下使用面向对象 2.针对面向对象的 封装 继承 多态一个一个的谈 3.根据你工作中的实际情况对应来举例子 封装 1.广义上:普遍的大家认为的 ...

  2. Python_Day_5装饰器、字符串格式化、序列化、内置模块、生成器、迭代器之篇

    一.装饰器 为什么要用装饰器??? 在实际的开发环境中应遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但也适用于函数式编程,简单地说,它规定已经实现的功能代码不是允许修改的,但是可以被扩展: 封 ...

  3. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  4. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  5. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  6. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  7. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  8. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

  9. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

随机推荐

  1. linx mysql安装

    文章引用:https://www.cnblogs.com/shizhongyang/p/8464876.html 只做了少量修改,感谢博主 注:未防止混淆,这里都用绝对路径执行命令 除了文件内容中的# ...

  2. 背包问题(动态规划 C/C++)

    Description 卖方:这件商品14元 买方:给你20元 卖方:不好意思,我的零钱不够 买方:好吧,这是15元,剩的当小费 当到一个地方旅游时,如果你买东西的地方不支持信用,带零钱还是非常有用的 ...

  3. mac 快键键图标对应

    Mac 键盘快捷键 您可以按下某些组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作.   要使用键盘快捷键,请按住一个或多个修饰键,然后按快捷键的最后一个键.例如,要使用 Command- ...

  4. mysql case when语句的使用

    case具有两种格式.简单case函数和case搜索函数. 简单函数 CASE [col_name] WHEN [value1] THEN [result1]-ELSE [default] END 搜 ...

  5. bWAPP----HTML Injection - Stored (Blog)

    HTML Injection - Stored (Blog) 界面 1 <div id="main"> 2 3 <h1>HTML Injection - S ...

  6. ABBYY FineReader 与资源管理器的集成使用

    ABBYY FineReader 15(Windows系统)与 Windows 资源管理器的集成使用后,在不打开软件的情况下,可通过右击启动快捷菜单开启. 通过与Windows资源管理器的集成,用户可 ...

  7. 精尽MyBatis源码分析 - SQL执行过程(四)之延迟加载

    该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...

  8. [教程] Android Native内存泄漏检测方法

    转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/ ...

  9. devc++编译时 undefined reference to `__imp_WSAStartup'

    socket编程时遇到的问题:

  10. Unity全局调用非静态函数

    Unity全局调用非静态函数 情形 大概就是做游戏的时候想做一个给玩家展示信息的东西,比如玩家按了不该按的键提醒一下之类的.这个脚本倒是很简单,找个Text组件往上面加字就行了.问题在于这个脚本游戏中 ...