闭包和装饰器
gloab和nonlocal
glob:在局部作用域中使用全局变量
nonlocal:主要用于函数嵌套时,使用外层函数的变量
闭包
函数内部定义的函数称为内部函数,该内部函数包含对外部(上层)作用域,而不是对全局作用域名字的,那么该内部函数称为闭包函数
闭包函数的基本形式
def func1():
name='hello world'
def func2():
print(name)
return func2
装饰器
程序源代码的原则:对功能扩展开放,对修改源代码封闭
即可以在源代码的基础上扩展功能,而不能修改源代码(原因是,系统上线了修改源代码,改错了咋整)
装饰器就是用来进行源代码功能能扩展的一种实现方式。
装饰器本质上是任意可调用的对象,目前能够理解的就是是函数,而被装饰的对象也可以是任意可调用的对象。
装饰器功能:是在不修改被装饰对象源代码以及被装饰对象的调用方式的前提下,为其添加新功能
装饰器原则:不修改源代码,不修改调用方式,还要能够增加新功能
装饰器基本形式
#装饰器定义
def deco(func):
def wrapper(*args,kwargs):
pass
res=func()
return res
return wrapper
#使用装饰器
@deco
def func1():
pass
保留原函数帮助文档
使用wraps
from functools import wraps
def deco(func):
@wraps(func)
def wrapper(*args,**kwargs):
pass
res=func()
return res
return wrapper
有参装饰器
#装饰器定义
def deco2(pattern):
def deco(func):
def wrapper(*args,kwargs):
pass
res=func()
return res
return wrapper
return deco
#使用装饰器
@deco(pattern)
def func1():
pass