from functools import update_wrapper
def debug(func):
def wrapper():
print "[DEBUG]: enter {}()".format(func.__name__)
return func()
return update_wrapper(wrapper,func)#使被修饰的函数名称不会变成wrapper @debug
def say_hello(): #被修饰后,函数的代码会变化,先调用wrapper函数
print "hello!"
print say_hello.__name__
def say_hello2():
print "hello!" say_hello()
'''
Disassembly of module1
''' Disassembly of debug:
16 0 LOAD_CLOSURE 0 (func)
3 BUILD_TUPLE 1
6 LOAD_CONST 1 (<code object wrapper at 0129FB18, file "<module1>", line 16>)
9 MAKE_CLOSURE 0
12 STORE_FAST 1 (wrapper) 19 15 LOAD_GLOBAL 0 (update_wrapper)
18 LOAD_FAST 1 (wrapper)
21 LOAD_DEREF 0 (func)
24 CALL_FUNCTION 2
27 RETURN_VALUE Disassembly of say_hello:
17 0 LOAD_CONST 1 ('[DEBUG]: enter {}()')
3 LOAD_ATTR 0 (format)
6 LOAD_DEREF 0 (func)
9 LOAD_ATTR 1 (__name__)
12 CALL_FUNCTION 1
15 PRINT_ITEM
16 PRINT_NEWLINE 18 17 LOAD_DEREF 0 (func)
20 CALL_FUNCTION 0
23 RETURN_VALUE Disassembly of say_hello2:
26 0 LOAD_CONST 1 ('hello!')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE

python 之修饰器的更多相关文章

  1. python中用修饰器进行异常日志记录

    当脚本中需要进行的的相同的异常操作很多的时候,可以用修饰器来简化代码.比如我需要记录抛出的异常: 在log_exception.py文件中, import functools import loggi ...

  2. python函数修饰器(decorator)

    python语言本身具有丰富的功能和表达语法,其中修饰器是一个非常有用的功能.在设计模式中,decorator能够在无需直接使用子类的方式来动态地修正一个函数,类或者类的方法的功能.当你希望在不修改函 ...

  3. python 类修饰器

    1. 修改类函数. 场景: 如果要给一个类的所有方法加上计时,并打印出来.demo如下: # -*- coding:utf-8 -*- import time def time_it(fn): &qu ...

  4. python decorator 修饰器

    decorator 就是给函数加一层皮,好用! 1 from time import ctime 2 3 def deco(func): 4 def wrappedFunc(*args, **kwar ...

  5. Python 函数修饰器

    # 一.用函数修饰函数 #!/usr/bin/python3 def decorate_func(func): def call(*args, **kwargs): print('you have c ...

  6. Python学习-修饰器 - itemgetter的妙用

    下面这篇对装饰器讲的很好,懂了. http://python.jobbole.com/85056/ <简单 12 步理解 Python 装饰器> 使用装饰器非常简单(见步骤10),但是写装 ...

  7. python 通用 修饰器

    import functools def log(option): def dec(func): def swapper(*arg, **karg): functools.update_wrapper ...

  8. Python修饰器的函数式编程

    Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...

  9. Python修饰器

    Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...

随机推荐

  1. 普通路由器刷开源固件DD-WRT的简单过程

    DD-WRT是基于Linux的无线路由软件,功能强大,它提供了许多一般路由器的软体所没有的功能,将路由器固件升级到DD-WRT可以提升内建于预设固件的限制,并将其转换成强大且具有进阶功能的商业级路由器 ...

  2. java 线程理解

    import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util. ...

  3. Android Studio学习NO.1 了解项目资源

    2018.3.1 12:40:51 阅读书籍:第一行代码 1. res目录 drawable 图片 mipmap 图标 values 字符串.样式.颜色 layout 布局 2. 引用(可在Andro ...

  4. head first c初探网络编程上

    server连接网络四部曲. 为了与外界沟通,c程序用数据流读写字节,比較经常使用的数据流有标准输入.标准输出.文件等. 假设想写一个与网络通信的程序.就须要一种新的数据流----------套接字. ...

  5. Git切换远程分支

         1. 切换git远程分支,使用命令:git checkout -b 分支名称.    注意:切换远程分支一定要带伤-b 参数,只有切换本地分支的时候才不需要 -b参数,-b 的意思是 bas ...

  6. Git-命令行-删除本地和远程分支

    命令行方式 Git Bash: 切换到要操作的项目文件夹 命令行 : $ cd <ProjectPath> 查看项目的分支们(包括本地和远程) 命令行 : $ git branch -a ...

  7. RocketMQ基本概念及原理介绍

    基本概念 ProducerGroup 通常具有同样属性(处理的消息种类-topic.以及消息处理逻辑流程—分布式多个客户端)的一些producer可以归为同一个group.在事务消息机制中,如果某条发 ...

  8. case when then

    --使用IN的时候 SELECT keyCol, CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B ) THEN 'Matched' ELSE 'Unmat ...

  9. vmware 中配置centos 7 静态IP

    虚拟机配置成静态IP可以保证每次宿主机器重启后,虚拟机的IP保持不变,这对于学习集群环境下的软件(如hadoop集群,mysql等数据库集群)很有用. vmware workstation 中装好li ...

  10. 7.STM32中GPIO理解

    端口概述 在STM32中,每个I/O端口可以由软件配置成为输入/输出模式.复位期间或刚复位后,I/O端口被配置成浮空输入模式.所有的GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时, 它们可以被激 ...