第十篇:装饰器

三、装饰器
1、装饰器是在函数调用之上的修饰

2、这些修饰仅是当声明一个函数或者方法的时候,才会应用的额外调用

3、使用装饰器的情形有:

3.1引入日志

3.2 增加计时逻辑来检测性能

3.3 给函数加入事务的能力

装饰器基础:

1、装饰是为函数和类指定管理代码的一种方式。

2、装饰器本身的形式是处理其他的可调用对象的可调用的对象( 如函数)

Python装饰器以两种相关的形式呈现

1、函数装饰器在函数定义的时候进行名称重绑定, 提供一个逻辑层来管理函数和方法或随后对它们的调用。

2、类装饰器在类定义的时候进行名称重绑定, 提供一个逻辑层来管理类, 或管理随后调用它们所创建的示例

函数装饰器安装包装器对象, 以在需要的时候拦截随后的函数调用并处理它们

类装饰器安装包装器对象, 以在需要的时候拦截随后的实例创建调用并处理它们

函数装饰器可以用来管理函数调用和函数对象, 类装饰器可以用来管理类实例和类自身

当主体函数或类定义的时候, 装饰器应用一次; 在对类或函数的每次调用的时候,不必添加额外的代码( 在未来可能必须改变)

函数装饰器

1、它们主要只是一种语法糖: 通过在一个函数的def语句的末尾来运行另一个函数, 把最初的函数名重新绑定到结果

用法
函数装饰器是一种关于函数的运行时声明, 函数的定义需要遵守此声明。 装饰器在紧挨
着定义一个函数或方法的d e f语句之前的一行编写, 并且它由@符号以及紧随其后的对于
元函数的一个引用组成——这是管理另一个函数的一个函数( 或其他的可调用对象)

deco1.py内容:

#!/usr/bin/env python
#coding:utf8

import time 

def loop():
    result = []
    for i in range(1,6):
        result.append(i)
        time.sleep(1)

    return result 

if __name__ == "__main__":
    start = time.time()
    print loop()
    end = time.time()
    print "program cost %5.3f seconds " % (end -start)

执行结果:

[1, 2, 3, 4, 5]
program cost 5.002 seconds 

deco2.py内容:

#!/usr/bin/env python
#coding:utf8

import time 

def timeit(func):
    start = time.time()
    res = func()
    end = time.time()
    print "program cost %5.3f seconds " % (end -start)
    return res

def loop():
    result = []
    for i in range(1,6):
        result.append(i)
        time.sleep(1)

    return result 

if __name__ == "__main__":
    print timeit(loop)

执行结果:

program cost 5.002 seconds
[1, 2, 3, 4, 5]

deco3.py内容:

#!/usr/bin/env python
#coding:utf8

import time 

def deco(func):
    def timeit():
        start = time.time()
        res = func()
        end = time.time()
        print "program cost %5.3f seconds " % (end -start)
        return res
    return timeit
@deco
def loop():
    result = []
    for i in range(1,6):
        result.append(i)
        time.sleep(1)

    return result 

if __name__ == "__main__":
    print loop()

执行结果:

program cost 5.019 seconds
[1, 2, 3, 4, 5]

color_font1.py内容:

#!/usr/bin/env python
#coding:utf8

def color(func):
    def color_font():
        return "\033[31;1m%s\033[0m" % func()
    return color_font

@color
def say_hi():
    return "Hello world"

@color
def greet():
    return "Welcome bob"

if __name__ == "__main__":
    print  say_hi()
    print greet()

执行结果:

Hello world
Welcome bob

color_font2.py内容:

#!/usr/bin/env python
#coding:utf8

def color(func):
    def color_font(*args):
        return "\033[31;1m%s\033[0m" % func(*args)
    return color_font

@color
def say_hi():
    return "Hello world"

@color
def greet(name):
    return "Welcome %s" % name 

if __name__ == "__main__":
    #print say_hi()
    print greet(‘bob‘)

执行结果:

Welcome bob

输出程序运行起止时间

写 deco.py 脚本,主要要求如下:
1、 编写一个循环 10 次的函数,每次循环睡眠 1 秒
2、函数运行前打印当前时间
3、函数运行结束后打印结束时间
4、使用装饰器的方式实现

方案
装饰器是在函数调用之上的修饰。这些修饰仅是当声明一个函数或者方法的时候,才会应用的额外调用。
在一个程序内部打印起止时间是可以的,但是如果很多程序都有相同的要求,那么就要
不断的去编写重复的代码。简单的使用闭包,执行程序成为闭包函数的参数,用起来显得不那么友好、方便。
使用装饰器,只需要在函数定义时额外加个装饰即可,调用函数时还是调用原始定义
的函数,不是将其作为其他函数的参数。既方便使用,又保持了函数原始的形态

#!/usr/bin/env python
#coding:utf-8

import time
def deco(func): #定义用于装饰器的函数
    def timeit():
        print ‘prog start at:‘, time.ctime()
        newList = func()
        print ‘prog done at:‘, time.ctime()
        return newList
    return timeit

@deco #定义函数时调用装饰器函数
def loop2(n = 10):
    myList = []
    for i in range(n):
        if i % 2:
            myList.append(i)
        time.sleep(1)
    return myList

if __name__ == ‘__main__‘:
    print loop2()

执行结果:

prog start at: Tue Aug 01 14:14:14 2017
prog done at: Tue Aug 01 14:14:24 2017
[1, 3, 5, 7, 9]
时间: 2024-10-08 11:13:12

第十篇:装饰器的相关文章

第九篇 装饰器

阅读目录 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 一 什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 二 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式 三 实现装饰器知识储备 装饰器=高阶函数+函数嵌套+闭包 四 高阶函数 高阶函数定义: 1.函数接

十六.装饰器

装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print '2013-12-25' ... >>> f = now >>> f() 2013-12-25 函数对象有一个__name__属性,可以拿到函数的名字: >>> now.__name__ 'now' >>> f.__name__ 'now' 现在,假设我们要增强now()函数的

(十)装饰器模式详解(与IO不解的情缘)

LZ到目前已经写了九个设计模式,回过去看看,貌似写的有点凌乱,LZ后面会尽量改进. 那么本章LZ和各位读友讨论一个与JAVA中IO有着不解情缘的设计模式,装饰器模式. 定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.                  这一个解释,引自百度百科,我们注意其中的几点. 1,不改变原类文件.                  2,不使用继承.                  3,动

Python初探第二篇-装饰器和迭代器,生成器

一,装饰器 1,概念 装饰器就是给已有的模块添加新的功能,如登录验证功能,运行时间功能等.本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能 2,理论基础 要想实现装饰器的功能,我们需要三个理论基础:函数闭包+函数嵌套+高阶函数.我们通过为如下模块加入统计运行时间的装饰器来讲解如何使用 import time def test_func(): fo

函数篇 ---> 装饰器与内置函数

装饰器: 从名字上来看,装饰器就是用来装饰内容的一个工具.本质上是一个闭包 在开发中,装饰器必须要遵守开放封闭原则:对扩展开放,对修改源代码封闭. 在装饰器中,有一个很重要的工具就是@,称之为语法糖,语法糖的本质就是:被装饰的函数名 = 装饰器的名字(被装饰的函数名) 在装饰器的应用上,有一个很简单的例子 计算简易的函数运行时间 import time # 导入time模块 print(time.time()) # 获取时间戳 start_time = time.time() # 开始时间 de

函数篇--装饰器

1.装饰器的作用 在 不修改被装饰对象的源代码:不修改被装饰对象的调用方式: 为被封装的对象添加新的功能. 例如下列: test函数为事先封装好的一个功能,但是在后期迭代的过程中,希望能为该功能增加一个计算运行时间的功能.这时候,装饰器就起到了作用了. def test(s): print('%s is testing'%s) time.sleep(3) def timer(func): def wrapper(*args, **kwargs): start = time.time() res

十四 —— 装饰器

设置类属性 1.@property装饰器,是python内置的装饰器,可以把类的方法伪装成属性调用的方式, 2.python内置的builtins模块中的property()函数 property(get_age, set_age, del_age, "年龄"):前面三个参数是方法名.调用时自动执行的方法,最后一个参数是个字符串,他用来做描述 原文地址:https://www.cnblogs.com/KeenaCherry/p/12110212.html

Python学习(十)—— 装饰器和函数闭包

装饰器 装饰器:本质就是函数,功能是为其他函数添加附加功能 原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 统计程序运行的时间(不使用装饰器): 这种方法修改了源代码,不能用于已经上线的程序 1 import time 2 def calc(l): 3 res = 0 4 start_time = time.time() 5 for i in l: 6 res += i 7 time.sleep(0.01) 8 stop_time = time.time() 9 print

Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = lambda x,y: x+y print(f(1,2)) 二.三元表达式 # x >y ? x :y # 条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果 x= 2 y=1 r = x if x > y else y print(r) # 2 三.map 四.map与lambda

说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以通过配置进行一种消息的订制,如,你可以订制email,sms,rtx,qq等,但不能同时采用多种机制完成消息的发送,这在一些情况下是没有问题的,但有时,我们也需要同时为客户提供多种消息的推送,这在目前还是挺现时的,如在用户下单后,同时为它发email 和短信进行通过,并对每个订单的过程进行跟踪并通知