Python decorator "@"(修饰符)

Python decorator

简介:

Python 的修饰符(decorator)“@”是个很方便的东西。它将目标函数作为参数处理,再返回处理过的结果。
Python 也自带很多修饰符 如@classmethod 等。 这里介绍自定义修饰的实现方法。

一般分两种实现方法: 方法实现、类实现

方法实现

这里举两个通用方法实现。

  • decorator不带参数:
    逻辑: [decorated] foo(‘Hello’) => decorator(foo)(‘Hello’) => wrapper(‘Hello’) => [real] foo(‘Hello’)
def decorator(func):
    def wrapper(*args,**kwargs):
        print "Decorator: Enter Wrapper..."
        print "Decorator: function: %s"%func.__name__
        func(*args,**kwargs)
    return wrapper
@decorator
def foo(say):
    print "foo: Enter foo"
    print "foo: Say %s"%say
if __name__ == "__main__":
    foo("Hello!")
  • decorator 带参数:
    逻辑: 其实就是无参数的外面多包裹一层
def decorator(goodbye = False):
    def wrapper1(func):
        print "Decorator: Enter wrapper1..."
        def wrapper2(*args,**kwargs):
            print "Decorator: Enter Wrapper2..."
            print "Decorator: function: %s"%func.__name__
            func(*args,**kwargs)
            if goodbye:
                print "Decorator: Good bye!"
        return wrapper2
    return wrapper1
@decorator(goodbye = True)
def foo(say):
    print "foo: Enter foo"
    print "foo: Say %s"%say

类实现

其实个人觉得方法实现已经很够用了。 当然将类方法实现也推出来。

class ClassDecorator(object):
    """docstring for ClassDecorator"""
    def __init__(self, func):
        print "ClassDecorator: Enter __init__"
        self.func = func
    def __call__(self,*args,**kwargs):
        print "ClassDecorator: Enter __call__"
        return self.func(*args,**kwargs)
@ClassDecorator
def foo(say):
    print "foo: Enter foo"
    print "foo: Say %s"%say

if __name__ == "__main__":
    foo("Hello!")

参考资料:
http://www.cnblogs.com/Jerry-Chou/archive/2012/05/23/python-decorator-explain.html
http://blog.csdn.net/shangliuyan/article/details/8555991
https://www.python.org/dev/peps/pep-0318/
http://blog.csdn.net/openxmpp/article/details/8779691

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值