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()
未完待续….