python之装饰器的学习

遇到问题
1、函数带括号与不带括号的区别
加括号是运行函数(调用的是函数的return结果),不加括号是函数索引(调用的是函数本身)

2、函数中*args和**kwargs所代表的意义
Python函数中*args和**kwargs是用来传递变长参数的用法。单星号形式(*args)用来传递非命名键可变参数列表,即tuple。双星号形式(**kwargs)用来传递键值可变参数列表,即dict。注意顺序,不可逆。否则会出现“SyntaxError: non-keyword arg after keyword arg”错误。

3、函数装饰器@符号的应用
用@decorator来替代 myfunction = decorator(myfunction),此方式是添加了一些语法糖。

然后介绍装饰器:
什么是装饰器?它有什么作用?它的原理是什么?我可以用它做什么?这样做有什么好处?
装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数。
作用就是当需要增加函数功能时,不用在原有的基础上更改,而是给它穿上外套,让它变成我们需要的样子。
原理就是,利用函数也是对象,在函数的参数传递过程中,函数也可以作为一个参数传递进函数内部。
可以用来给原来的函数加以某些限制条件。
它让代码更加简介:通过将边界检测从函数本身分离,使用装饰器包装他们,并应用到所有需要的函数中。

另外关于廖大的装饰器问题
再思考一下能否写出一个@log的decorator,使它既支持:
@log
def f():
pass
又支持:
@log(‘execute’)
def f():
pass

年轻的两种写法

import functools
def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args,**kwargs):
            print(text + 'start')
            result = func(*args,**kwargs)
            print(text + 'end')
            return result
        return wrapper
    if isinstance(text,str):
        return decorator
    else:
        a = text;
        text = ""
        return decorator(a)

@log
def a():
    print("one")
a()
@log("excute")
def b():
    print("two")
b()

**import functools
def log(text):
    if callable(text):
        @functools.wraps(text)
        def wrapper(*args,**kwargs):
            print('start')
            result = text(*args,**kwargs)
            print('end')
            return result
        return wrapper
    else:
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                print(text + ' start')
                result = func(*args, **kwargs)
                print(text + ' end')
                return result
            return wrapper
        return decorator

@log
def a():
    print("one")
a()
@log("excute")
def b():
    print("two")
b()**

成熟的写法

这里写代码片

更详细的装饰器介绍
http://python.jobbole.com/85056/
http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值