闭包和装饰器

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
原文地址:https://www.cnblogs.com/chenrenjian/p/7050290.html