Python 中修饰器

修饰器就是一个返回函数的高阶函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from functools import wraps

def log(func):
    #@wraps(func)   #如果不加这句,log返回wrapper,那么hack.__name__ 就是 wrapper.
    def wrapper(*args,**kwargs):
        print('call %s'% func.__name__)
        return func(*args,**kwargs)
    return wrapper

@log
def hack():
    print('hello world !!!')

print(hack.__name__)

如果decorator本身需要传入参数,那就需要编写一个返回decorator的高阶函数,写出来会更复杂。比如,要自定义log的文本

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

这个3层嵌套的decorator用法如下:

@log('execute')
def now():
    print('hello world!')

和两层嵌套的decorator相比,3层嵌套的效果是这样的:

>>> now = log('execute')(now)
图片发自简书App
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,587评论 0 6
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 5,531评论 6 53
  • 前言 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pa...
    linheimx阅读 637评论 0 4
  • 装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返...
    时间之友阅读 2,307评论 0 3
  • 有时候, 你的力量很小很小, 却在经意间, 把路上的一片纸屑放进垃圾箱。 有时候, 你的力量很大很大, 却在不经意...
    小剧在成长阅读 185评论 2 3