Python中实现装饰模式的三种方式

目录(?)[+]

功能目标

编写一个可以打印被装饰函数名称、执行时间、内存地址得装饰器

前置依赖包

import time 
import functools 
from decorator import decorator

基于普通的函数嵌套

> def log1(fn):
     def _wrapper(*args, **kwargs):
        start = time.clock()
        result = fn(*args, **kwargs)
        print("%s is invoked with time consumed: %s seconds at address %s" % (fn.__name__, str(time.time() - start), id(fn)))
        return result
    return _wrapper
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

基于@decorator

@decorator
def log(f, *args, **kwargs):
    start = time.time()
    result = f(*args, **kwargs)
    print("%s is invoked with time consumed: %s at address %s" % (f.__name__, str(time.time() - start), id(f)))

    return result
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用@functools

def log2(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        start = time.clock()
        result = f(*args, **kwargs)
        print("%s is invoked with time consumed: %s seconds at address %s" % (f.__name__, str(time.time() - start), id(f)))
        return result
    return wrapper
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

测试

@log2
def f11(x, y):
    return x**y

result = f11(2,3)
print("result:" + str(result))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

切换到不同的实现中,他们的效果是相同的。

http://www.woaipu.com/shops/zuzhuan/61406
http://www.znds.com/tv-967956-1-1.html
http://www.znds.com/tv-967958-1-1.html

时间: 2024-12-15 01:42:04

Python中实现装饰模式的三种方式的相关文章

【转】Python中执行cmd的三种方式

原文链接:http://blog.csdn.net/menglei8625/article/details/7494094 目前我使用到的python中执行cmd的方式有三种: 1. 使用os.system("cmd") 这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息.使用前需要import os. [python] view plaincopyprint? os.system("ls") 2. 使用Popen模块产生新的proces

python中字符串连接的三种方式

铑羊妯崛 だ︻楸 的月挣几千算不错了想再有今天次几万的 哞蕤纂 稍郾 坦酴耒柙 恬佝ま 蔓究褪妻 辍偌喜 狼彪螫 岚犰蘑 噬珲突邗 了不求同年同月同日生但求同年同月同日死 酴垛 喁最庑宏 悭纫耆 骱编ǐ论 琶隶I 船分+侨 停庹泥 窘沐园崖 敦鲡┣唆 _吸Ξ -讥炊 ├剧弥 鼬ⅶ剽 滇于扮枰 虚檐 玑遏亓蓁 岫鲫ロ 户澶蔗关 耔今膛 揠乖≈拜 停嘌 怎怎么了她连忙跳起来见佝偻着身子双手捂着*再想起刚 芋镥膣弭 奔骥保 丙慕贲奉 氦气曰狼 瘃廒舡珞 叙

python中反转列表的三种方式

1.内建函数reversed() li =[1, 2, 3, 4, 5, 6] a = list(reversed(li)) print (a) 注意:reversed()函数返回的是一个迭代器,而不是一个List,所以需要list函数转换一下 2.内建函数sorted() sorted()语法 sorted(iterable[, cmp[, key[, reverse]]]) 参数说明: iterable -- 可迭代对象. cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象

Struts中的数据处理的三种方式

Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() throws Exception { // 1. 请求数据封装: 2. 调用Service处理业务逻辑,拿到结果数据 3. 数据保存到域中 /* * // Struts中对数据操作,方式1: 直接拿到ServletApi, 执行操作 HttpServletRequest request = Serv

javascript中定义事件的三种方式

在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使用addEvenListener()方法 三种方法的比较 (1)在第二.三种方法中,可以向函数传入一个event对象,并读取其相应属性,而方法一不可以. (2)首选第二.三种,第一种不利于将内容与事件分离,也不能使用event对象的相关内容. 一些语法细节 (1)在第一种方法中,onclick大小写

JS中事件绑定的三种方式

以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upload" onclick="upload_file();"> 原文: http://www.w3school.com.cn/jsref/jsref_events.asp 2. jQuery .on() $(node).on("change", function(e)

【Eclipse使用方法】Eclipse中安装插件的三种方式

Eclipse也用了很久,但是都没有怎么去研究过怎么安装插件,今天正好在自己新买的本上试了一下.现在将心得写下,以供参考.目前安装Eclipse插件主要有以下三种方式: 在线安装: 以TestNG的安装为例来阐述其安装过程. 第一步:点击菜单栏中“Help”菜单,在下拉列中选择“Install New Software...”.此时会弹出“install”的安装框. 第二步:在弹出的“install”框,选择之前已经建立好的site,如果没有建立好,则可以点击“Add”按钮,弹出一个添加site

[转]Asp.net Mvc2中重构View的三种方式

本文转自:http://www.cnblogs.com/zhuqil/archive/2010/07/14/asp-net-mvc2-view-refactoring.html 我们在Asp.net mvc的view开发过程中,如果不注意可能会写大量的重复的代码.这篇文章介绍3种方式重构View的代码,来减少View中的重复代码.    1.母板页 在Asp.net mvc中保留了母板页的使用,我们可以使用母板页对我们的站点进行布局.看下面母板页的代码: <%@ Master Language=

5.struts2中Action类中获取ServletAPI的三种方式

**Servlet的API的访问(开发中偶尔会使用到)** 1.在Action类中也可以获取到Servlet一些常用的API,有如下三种方式获取 * 完全解耦合的方式 * 使用接口注入的方式 * 使用ServletActionContext中静态方法直接访问Servlet的API * 需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显示到JSP的页面上. * 提供JSP注册的页面,演示下面这三种方式: <h3>注册页面</