闭包和装饰器

    xiaoxiao2023-11-13  141

    闭包 内部函数可以使用外部函数的变量称为闭包 函数嵌套 内部函数使用外部函数 外部函数返回内部函数 闭包格式: def test1(): n = 1 def test2(): print(n) return test2 闭包举例: def show(name): def test(msg): print(name +’: '+msg) return test2

    tom = show(‘tom’) tom(‘你好’) jack = show(‘jack’) jack(‘我不好’) 输出结果:tom: ‘你好’ jack: ‘我不好’ 闭包修改外部函数变量: 使用nonloacl修改变量 def show(): n = 10 def inner(): nonloacl n n += 10 return inner

    func = show() func() 装饰器: 在闭包函数的基础上添加额外的功能 不修改函数源代码 不修改函数调用方式 使用举例:

    import time def show(func): def inner(): start = time.time() func() end = time.time() print(f"一共用了(end-start)秒") return inner @show def test(): for i in range(1000000): print(i) test()

    通用装饰器使用:

    def show(func): def inner(*args,**kwargs): print("开始装饰") func(*args,**kwargs) print("结束装饰”) return inner @show def test(a): print(a) test('hello')

    多个装饰器

    def show1(func): def inner(*args,**kwargs): print("装饰器1-1") func(*args,**kwargs) print("装饰器1-2") def show2(func): def inner(*args,**kwargs): print("装饰器2-1") func(*args,**kwargs) print("装饰器2-2") @show1 @show2 def test(): print("show........") test() #执行过程是由下到上执行

    类装饰器

    class Show(object): def __init__(self,func): self.func=func def __call__(self,*args,**kwargs): print("开始装饰") self.func() print("结束装饰") @show def test(): print("show........")

    装饰器传参

    def get_args(msg): def show(func): def inner(*args,**kwargs): print("请先" + msg) func() print("发表评论") return inner return show @get_args('登录') def test(): print("登录成功") test()

    *装饰器执行顺序 单个装饰器执行过程图解

    多个装饰器执行过程

    最新回复(0)