Python之闭包and装饰器

Posted 老王同鞋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之闭包and装饰器相关的知识,希望对你有一定的参考价值。

闭包和装饰器是Python中非常重要的一种语法格式,在日常工作中应用非常广泛。

首先,我先为大家简单的接受一下闭包的概念。

闭包:闭包是在函数嵌套的基础上,内层函数使用到外层函数的变量,且外层函数返回内层函数的引用的一种语法格式。

闭包的基本格式,代码实现:

def outer():
    num = 0
    def inner():
        # 使用外部函数的变量
        print(num)
    return inner # 返回inner函数在内存空间中的地址


# 将outer函数的返回值赋值给变量f,也就是说将f指向outer函数中的inner函数的内存地址
f = outer() 
# 调用inner函数
f()

我们学习闭包的作用,其实就是为了学习装饰器。

那么,我们先来了解一下什么是装饰器。

装饰器就是通过闭包来对指定的函数进行功能的扩充。

装饰器的特点:

1.不修改指定修饰函数的代码,

2.不修改指定修饰函数的调用方式,

3.给指定修饰函数增加相应的功能。

装饰器的种类:

1.普通装饰器

  普通装饰器就是闭包语法格式的基础上,满足装饰器的特点的一种语法格式。

普通装饰器的代码实现:

def decorator(func):
    # 此时func指向的是show函数
    def inner(*args,**kwargs):
        # 装饰的代码
        ret = func()
        return ret
    return inner 


@decorator  # 原理为 show = decorator(show)
#   此时show指向的是decorator函数中的inner函数
def show():
    print(show run....)

# 此时相当于调用decorator函数中的inner函数,并函数的返回值赋值给ret
ret = show()

2.类装饰器

  类装饰器就是通过一个类来装饰函数,相较于普通装饰器,类装饰器可以使用父类中的方法。

类装饰器的代码实现:

class Decorator(object):
    # 使用init方法来接收需要装饰的函数
    def __init__(self, func):
        # func指向show函数所在的内存空间地址
        # 使用__func指向需要装饰的函数的内存空间地址
        self.__func = func

    # 可以让类的对象通过对象名()的方式被调用
    def __call__(self, *args, **kwargs):
        # 此时相当于调用了show函数
        ret = self.__func(*args, **kwargs)
        return ret

@Decorator  # 原理是 show = Decorator(show)
# 此时show指向的是Decorator类的对象的内存地址
def show():
    print(show run .....)

# 此时表示Decorator对象被调用,并接受show函数的返回值
ret = show()

未完待续....

以上是关于Python之闭包and装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python概念之装饰器迭代器生成器

python之函数的进阶闭包装饰器

python之闭包函数 装饰器 作业

Python之面向对象:闭包和装饰器

python之函数装饰器

Python D9 and D10