吾爱编程 网站首页 程序人生 Python开发 查看内容

深入理解Python装饰器

2019-3-12 21:16| 发布者: admin| 查看: 1444| 评论: 0

摘要: 在Python学习中装饰器(Decorators)是一个很关键的学习要素。学好装饰器,你的Python功底及代码的威力将大大提高。装饰器是什么?就是在不修改函数内部定义的前提下,在代码运行期间动态增加功能的方式。如果我们要增 ...
在Python学习中装饰器(Decorators)是一个很关键的学习要素。学好装饰器,你的Python功底及代码的威力将大大提高。

装饰器是什么?就是在不修改函数内部定义的前提下,在代码运行期间动态增加功能的方式。如果我们要增加某些功能,比如说打印日志,增加内存缓存,增加参数检测等等,可以在具体的函数内部定义,但是装饰器,则允许我们在不修改该函数的前提下实现这些功能。

下面列举几种常见应用:

1. 增加打印代码

def argument_print(f):
    def helper(x):
        print("input:", x)
        return f(x)
    return helper
@argument_print
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1)+fib(n-2)
print(fib(40))


2. 增加内存缓存
def memoize(f):
    memo = {}
    def helper(x):
        if x not in memo:
            memo[x] = f(x)
        return memo[x]
    return helper
@memoize
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1)+fib(n-2)
print(fib(40))


3.增加参数检测
def argument_test_natural_number(f):
    def helper(x):
        if type(x) == int and x >= 0:
            return f(x)
        else:
            raise Exception("Argument is not an integer")
    return helper
@argument_test_natural_number
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1)+fib(n-2)
print(fib(40))


当然,我们也可以使用多个装饰器来修饰同一个函数,同时达到多个我们需要的效果:

@argument_print
@memoize
@argument_test_natural_number
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1)+fib(n-2)
print(fib(40))


需要注意的是,在上述装饰器中,都定义了一个中间函数helper,由于它定义在函数内部并且利用到了当前外部环境变量f,因此它可以被看作是闭包。 装饰器的功能不仅仅在此,我们还可以使用带参数的装饰器来动态增加参数。具体的做法主要是在之前的基础上,在外部加入一层函数定义,引入要使用的参数。这时原有的装饰器就在现有装饰器内形成了一个闭包。
希望本文所述对大家程序设计有所帮助。
3

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (3 人)

关闭

站长推荐上一条 /1 下一条

返回顶部

平台简介

吾爱编程网:http://www.52pg.net/是IT技能学习交流平台,我们提供了丰富的移动端开发、php开发、web前端开发、android开发、Java开发、Python开发、大数据开发、区块链开发、人工智能开发以及html5等大量的实战视频教程资源。(如果我们有侵犯了您权益的资源请联系我们删除)

点击这里给我发消息|Archiver|手机版|小黑屋|站点地图|吾爱编程  |网站地图

Powered by Discuz! X3.2??? 2017-2020 Comsenz Inc.??吾爱编程网