Discuss / Python / 装饰器decorator

装饰器decorator

Topic source
import functools

def log(func_str):
    if isinstance(func_str, str):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kw):
                print('%s %s():' % (func_str, func.__name__))
                _func =func(*args, **kw)
                print('%s end %s()' % (func_str, func.__name__))
                return _func
            return wrapper
        return decorator
    else:
        @functools.wraps(func_str)
        def wrapper(*args, **kw):
            print('begin call %s():' % func_str.__name__)
            _func = func_str(*args, **kw)
            print('end call %s()' % func_str.__name__)
            return _func
        return wrapper


@log
def now():
    print('2015-3-25 func')
now()


@log('execute')
def now():
    print('2017-7-11 text')
now()

执行结果

begin call now(): 2015-3-25 end call now() execute now(): 2017-7-11 execute end now()

我的作业地址,欢迎交流 https://github.com/xiajava/learn-python3

有一点小疑惑 为什么wrapper函数最后要return _func, 直接在上下两个print之间执行完 func_str(args, *kw) 最后什么也不return,结果也一样

我这就是用if判断log情况,然后把上面廖大2种代码放到分支里。

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。 本质上,decorator就是一个返回函数的高阶函数.

上面是直接return func(*args, **kw),所以我先用_func记下来,函数调用前后打印日志,再返回函数。 Discuss

WOWsapling 2 Created at 6-22 17:43 return目的是返回 func(args, *kw)的返回值,编程中我们一般不会直接打印出结果,一般都是通过返回值的方式给予结果。打印只是在测试中常用(或者编程学习中常用吧)。大概是这样的。返回值还是挺重要的。--小白解释不可全信。


访问限制这一章中:

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

_func用法好像在哪看到过,忘记了


  • 1

Reply