python中的闭包与装饰器

一.从闭包说起

()python中闭包。
通俗的理解:函数里面包含另一个函数。里面函数用到了外面函数的数据。代码说明如下:

def func1(str):

    def func2():
        print("你好 %s"%str)
    return func2
    
f = func1("小明")
f()
	输出结果:你好小明

理解:str在func1中有效,即在fun2中也生效。func1返回func2的引用。这样就在func2中用到了fun1的数据。
(2)当你在fun1中定义局部变量,同里在func2中也同样生效,不过需要用nonlocal声明。

def func1(str):

    a = 1

    def func2():

        nonlocal a
        a = a+1
        print("你好 %d"%a)

    return func2


f = func1("小明")
f()

二.装饰器

装饰器:外部函数传入被装饰函数名,内部函数返回装饰函数名。

特点:1.不修改被装饰函数的调用方式 2.不修改被装饰函数的源代码。就可以增加原有函数的功能。

(1)无参数的装饰器。
def set_func(func):
    print("----开始装饰-----")

    def call_func(*args,**kwargs):#这里写成多值参数是为了增加装饰器的通用性

        print("--这是验证1")
        print("--这是验证2")

        return func(*args,**kwargs) #拆包

    return call_func

@set_func#test1 = set_func(test1)
def test1(num,*args,**kwargs):

    print("-----test1----%d" % num)
    print("-----test1----", args)
    print("-----test1----", kwargs)

    return "ok","200"

@set_func
def test2():
    pass

ret = test1(100)
print(ret)

装饰器的执行流程:
装饰器相当于执行了test1 = set_func(test1),让func指向了原来test的内存区域,然后让test1指向了闭包区域。这样就实现了不用改变原来函数的调用方法,利用闭包扩展了函数的功能。

(2)有参数的装饰器
def arg_func(name):

    def set_func(func):

        def call_func(*agrs, **kwagrs):

                print ("这是装饰器传进来的参数%s"%name)

                return func(*agrs, **kwagrs)
        return call_func

    return set_func



@arg_func('demo1')
def demo1():

    print ("这是demo1")

@arg_func('demo2')
def demo2():

    print ("这是demo2")

demo1()

demo2()

执行结果:

这是装饰器传进来的参数demo1
这是demo1
这是装饰器传进来的参数demo2
这是demo2

#再一次利用闭包里面函数可以访问外面函数的参数的原来,给里面的装饰器带一个参数,这样就实现了带参数的装饰器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值