# -*- 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. 利用CSS3实现div页面淡入动画特效

    利用CSS3实现页面淡入动画特效   摘要 利用CSS3动画属性"@keyframes "可实现一些动态特效,具体语法和参数可以网上自行学习.这篇文章主要是实践应用一下这个动画属性 ...

  2. Blazor入手教程(一)前言

    Blazor入手教程(一)前言 结论 最近在学习blazor.得出了这么一个结论: Blazor是一门很值得学习的技术,未来.net下将会有相当多的 web应用使用blazor开发.十分看好这一技术, ...

  3. [i春秋]“百度杯”CTF比赛 十月场-Hash

    前言 涉及知识点:反序列化.代码执行.命令执行 题目来自:i春秋 hash  如果i春秋题目有问题可以登录榆林学院信息安全协会CTF平台使用 或者利用本文章提供的源码自主复现 [i春秋]"百 ...

  4. [前端web安全]XSS漏洞基础入门

    前言 XSS漏洞 Xss(Cross-Site Scripting)意为跨站脚本攻击,为了不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS ...

  5. div定时放大缩小

    <!DOCTYPE html> <html> <head> <style> .anim{ width: 100px; height: 100px; ba ...

  6. vue在移动端使用alloyfinger手势库操作图片拖拽、缩放

    最近开发一个活动需要在手机上给上传的头像加上边框.装饰,需要拖拽.手势缩放边框下的头像图片,因为是vue项目,开始尝试了vue-drag-resize这个组件,对图片拖拽支持很完美,但是无法手势缩放, ...

  7. FL Studio中echo的延迟作用

    今天来一起研究FL Studio的Echo Delay的作用,Echo Delay可以从MIDI输入创建回声,并允许我们通过音量,声像,切除和共振,音高和时间来操纵延迟. 图1:Echo Dealy ...

  8. Java8常用的内置函数式接口(一)Predicate、Consumer、Supplier、Function

    Java8常用的内置函数式接口(一) 简介 JDK 1.8 API中包含了很多内置的函数式接口.有些是在以前版本的Java中大家耳熟能详的,例如Comparator接口,或者Runnable接口.对这 ...

  9. django绕过admin登录设置

    在admin.py文件添加以下函数本文是转载:#绕过admin登录def allow_anonymous_user(): from django.contrib.auth.models import ...

  10. Java集合【3】-- iterable接口超级详细解析

    目录 iterable接口 1. 内部定义的方法 1.1 iterator()方法 1.2 forEach()方法 1.3 spliterator()方法 总结 iterable接口 整个接口框架关系 ...