闭包与装饰器

1 闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递函数外的对象,内部函数和使用的外部函数提供的变量构成的整体称为闭包。

def closure():
    print('外函数')
    def fun_inner():
        print('内函数')
    return fun_inner
fun = closure()
fun()

外函数
内函数
2 函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候 就是引用传递,所以上述代码也可`

def closure():
    print('外函数')
    def fun_inner():
        print('内函数')
    return fun_inner
fun = closure()
closure()()

外函数
内函数
3 装饰器的基础是闭包,思想是 1封闭:已实现的功能代码块
2 开放:对扩展开发

def decorator(fun):
    def fun_inner():
        fun()
    return fun_inner
@decorator
def func():
    print('func函数')
func()

func函数
4 装饰器传参

def decorator(fun):
    def fun_inner(a,b):
        print(a,b)
        fun()
    return fun_inner
@decorator
def func():
    print('func函数')
func(1,2)

1 2
func函数
装饰器不定长参数

def decorator(fun):
    def fun_inner(a,*args):
        print(a,args)
        fun()
    return fun_inner
@decorator
def func():
    print('func函数')
func(1,2,3,4,4,5,)

1 (2, 3, 4, 4, 5)
func函数
装饰器传参问题

def decorator_out(num):
    def decorator(fun):
        def fun_inner(a,b):
            print(num)
            print(a,b)
            fun()
        return fun_inner
    return decorator
@decorator_out(2)
def func():
    print('func函数')
func(1,2)

2
1 2
func函数
5 多个装饰器装饰一个函数

def fun1(fun):
    print('外fun1函数')
    def fun1_inner():
        print('内fun1函数')
        fun()
    return fun1_inner
def fun2(fun):
    print('外fun2函数')
    def fun2_inner():
        print('内fun2函数')
        fun()
    return fun2_inner
@fun2
@fun1
def fun():
    print('fun函数')
fun()

外fun1函数
外fun2函数
内fun2函数
内fun1函数
fun函数

1 分析此函数执行,@fun1先执行,此时 fun=fun1(fun)
输出 : 外fun1函数
fun的地址内容为
def fun1_inner():
print(‘内fun1函数’)
fun() # == print(‘fun函数’)

2 此时 @fun2 发现上方已为函数,fun=fun2(fun)
输出 : 外fun2函数
fun的地址内容为:
def fun2_inner():
print(‘内fun2函数’)
print(‘内fun1函数’)
print(‘fun函数’)

3 再执行fun()
外fun2函数
内fun2函数
内fun1函数
fun函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值