文档章节

decorator定义与使用<一>:function decorator

Aomo
 Aomo
发布于 2016/02/05 22:26
字数 488
阅读 29
收藏 1
#!/usr/bin/python3
"""
decorator定义与使用<一>:function decorator

Function decorators are largely just syntactic sugar that runs one function(the decorated one) through 
another(the decorator,a callable object) at the end of a def statement, and rebinds the original function 
name to the result.

Deccorator of a simple function can be either a class with __call__ or a function so long as it returns a callable 
object, at the end of which a result should better be returned no matter whether the decorated function returns anything 
because the original function may return something.

The decorator function is called immediately after the definition of the decorated function, so is the decorator
class initialized.

NOTE: Decorator of a class method can only be a function. If a decorator of a class with __call__ is applied to a class method,
the 'self' argument in the decorated method would never be passed to the __call__(*args) method of the decorator class.

Following comes a simple example.
----------------------------------
def decorator_example(func,*args):
    do something to initialize
    def tmp(*args):
        do any thing you want
        return func(*args)
    return tmp
    
@decorator_example
def():
    pass
    
----------------------------------

"""
class Tracer:
    """
    Tracer是一个类形式的function decorator,用来Trace其他函数的调用。
    @Tracer
    def function_name(...):...
    """
    def __init__(self,func):
        """
        每个被此decorator修饰的函数,在其定义(声明)之后立即执行此init函数.
        参数:func即为被修饰的函数.
        """
        print('Start tracing:',func.__name__)
        self.calls=0
        self.func=func
        
    def __call__(self,*args):
        """
        调用被修饰的函数时,其实是调用此函数.
        args为调用被修饰函数时传入的参数.
        """
        #You can do whatever you want here,before the 'return'
        self.calls+=1
        print("%s calls to %s" % (self.calls,self.func.__name__))
        return self.func(*args)    

def Tracer2(func):
    """
    Tracer2是一个函数形式的function decorator。
    """
    print('decorating %s with Tracer2' % func.__name__)
    def tmp(*args):
        print('Tracer2:'+func.__name__) #You can do whatever you want here,before the 'return'.
        return func(*args)
    return tmp

@Tracer
def foo(a,b,c):
    return a+b+c

#取消下一行注释,即可验证__init__中的注释:decorator的__init__会在每个被修饰的函数定义之后立即执行,为每个函数生成一个对应的decorator    
#print('between foo and foo2')

@Tracer
def foo2(a,b,c):
    return 'foo2 '+a+b+c
@Tracer2    
def foo3(a,b):
    print('%s,%s' % (a,b))
    return 'foo3 '+a+b

if __name__=='__main__':
    print('---decorator_demo.py---')
    ret=foo3('z','x')
    print(ret)


© 著作权归作者所有

共有 人打赏支持
Aomo
粉丝 1
博文 35
码字总数 16028
作品 0
高级程序员
python装饰器(decorator)学习笔记

文章来自stackoverflow上一个问题的答案 Python’s functions are objects To understand decorators, you must first understand that functions are objects in Python. This has importan......

alazyer
2016/08/25
19
0
转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】

转载请注明来源:唐磊的个人博客《python中decorator详解》 前面写python的AOP解决方案时提到了decorator,这篇文章就详细的来整理下python的装饰器——decorator。 python中的函数即objects...

laugh2last
2015/08/17
0
0
Django中六个常用的自定义装饰器

装饰器作用 decorator是当今最流行的设计模式之一,很多使用它的人并不知道它是一种设计模式。这种模式有什么特别之处? 有兴趣可以看看Python Wiki上例子,使用它可以很方便地修改对象行为,...

j_hao104
07/03
0
0
Python高级编程-----读书笔记

Keep Code Simple Not Data l 减少代码,能减少生成的代码,因此能减少执行时间 2. 使用List Comprehensions构造List,快12倍 List Comprehension性能测试 使用List Comprehension使语法简洁...

索隆
2012/05/19
0
0
设计模式 – 装饰模式(Decorator)

问 题的提出:一个人装扮,可以先穿裤子,再穿衣服,再穿鞋子;也可以先穿衣服,再是裤子,再是鞋子,由于裤子、衣服、鞋子种类很多,故搭配种类就更多了。又 如制作蛋糕,鲜奶油蛋糕、草莓蛋...

lovedreamland
2011/02/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

php 使用redis锁限制并发访问类

1.并发访问限制问题 对于一些需要限制同一个用户并发访问的场景,如果用户并发请求多次,而服务器处理没有加锁限制,用户则可以多次请求成功。 例如换领优惠券,如果用户同一时间并发提交换领...

豆花饭烧土豆
13分钟前
0
0
Linux环境搭建 | 手把手教你配置Linux虚拟机

在上一节 「手把你教你安装Linux虚拟机」 里,我们已经安装好了Linux虚拟机,在这一节里,我们将配置安装好的Linux虚拟机,使其达到可以开发的程度。 Ubuntu刚安装完毕之后,还无法进行开发,...

良许Linux
14分钟前
0
0
Nginix开启SSL支持HTTPS访问(自签名方法)

Nginix开启SSL支持HTTPS访问(自签名方法) 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器...

openthings
30分钟前
0
0
(三)Nginx配置·续

概述 前文写了关于Nginx环境配置,但是还没有完,接下来将会继续讲三个相关的配置 主要是以下三个 1.Nginx访问日志 2.Nginx日志切割 3.静态文件不记录日志和过期时间 Nginx访问日志 1.先看看...

杉下
今天
1
0
jquery创建类似于java的map

var map = {}; // Map map = new HashMap(); map[key] = value; // map.put(key, value); var value = map[key]; // Object value = map.get(key); var has = key in map; // boolean has = ......

SuperDabai
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部