python——闭包和装饰器

1、闭包:函数定义中,再定义一个函数,并使用外层函数的参数,则该内部函数和被使用的参数被统称为闭包

def test(number):
    print("-----1------")

    def test_in(numbder2):
        print("-----2------")
        print(number+number2)
    
    print("-----3-------")
    return test_in

ret = test(100)
print("-"*30)
ret(100)

-----1------
-----3-------
-------------------------------------
-----2-------
200

2、装饰器

#对无参数函数进行装饰

def func(functionName):
    def func_in():
        functionName()
    return func_in

def test():
    print("-----test-----")
test = func(test) #对函数test的功能进行了扩展,现在的test函数指向func_in函数

#等同于,在test函数定义之前加上@func
@func  #在test还没开始使用之前,就已经对test进行了包装
def test():
    print("-----test-----")
#对有参数的函数进行包装
def func(functionName):
    def func_in(*args,**kwargs):
        functionName(*args,**kwargs)
    retutn func_in

@func
def test(a,b):
    print("---test--a=%d,b=%d----"%(a,b))
#对带有返回值的函数进行装饰
def func(functionName):
    def func_in():
        xxx = functionName() #保存返回值
        return xxx
    return func_in

@func
def test():
    print("----test-----")
    return "haha"

ret = test()
print("test return value is %s" % ret)
#带有参数的装饰器
func_arg(arg)
    def func(functionName):
        def func_in():
            functionName()
        return func_in
    return func

#1、先执行func_arg("heihei")函数,这个函数return的结果是func这个函数的引用
#2、@func
#3、使用 @func 对test进行装饰

@func_arg("heihei")
def test():
    print("---test----")

test()
#类当装饰器
class Test(object):
    def __init__(self,func):
        print("----初始化-----")
        print("func name is %s"%func.__name__)
        self.__func = func
    def __call__(self):
        print("---装饰器中的功能----")
        self.__func()

@Test                     #执行到这里的时候,类中的init函数已经执行
def test():
    print("----test-----")

test()                    #现在的test已被类装饰,self.__func函数指向原定义的test

#输出
-----初始化-----
func name is test

------装饰器中的功能------
------test-------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值