python中的*args与**kwarsg以及闭包和装饰器

背景:

回顾基础

参考:

有人看到*args和**kwargs就把桌子掀了【#084】

python__高级 : @修饰器(装饰器)的理解 - cccy - 博客园 (cnblogs.com)

过程:

先理解闭包,再理解装饰器,不要忘了不定长参数

def func():
    msg = '111'
    def func1():
        print(msg)
    return func1

"""
1-理解闭包
闭包即内部函数调用外部函数作用域里面的变量
比如func1就是一个闭包函数
"""
func()()# 这里实际上是func1()

"""
2-装饰器
fn是被装饰的目标函数
2.1-仅仅只是传递函数名的装饰器[基本不会用到]
2.2-装饰带有参数的函数
2.3-装饰带有返回值的函数
2.4-装饰参数不确定的函数[可归类到装饰带有参数的函数里面]
2.5-装饰器本身携带参数
"""

def decorator(fn):
    def wrapper():
        print("添加的功能,装饰不带有参数的函数")
        return fn()
    return wrapper

@decorator
def test():
    print("原有功能")


test()# 实际上是decorator(test)

def decorator1(fn):
    def wrapper(n1,n2):
        print("添加的功能,装饰带有参数的函数")
        return fn(n1,n2)
    return wrapper

@decorator1
def test1(a,b):
    print("a+b=%s"%(a+b))
    print("原有功能")


test1(1,2)# 实际上是decorator1(test1(1,2))

def decoretor2(fn):
    def wrapper():
        print("添加的功能,装饰带有返回值的函数")
        res = fn()
        return res
    return wrapper

@decoretor2
def test2():
    print("原有功能")
    return "返回值001"

a = test2() # 实际是decorator2(test2)
print(a)


def decorator3(fn):
    def warpper(*args,**kwargs):
        print("添加的功能,装饰不定长参数的函数")
        return fn(*args,**kwargs)
    return warpper

@decorator3
def test3(n1,n2,n3):
    print("原有功能")
    print(n1+n2+n3)


test3(1,2,3)# 实际上是decorator1(test1(1,2,3))

def decorator4(home):
    def func_1(fn):
        def wrapper(*args,**kwargs):
            print("装饰器本身携带参数")
            print("目前家在%s"%(home))
            return fn(*args,**kwargs)
        return wrapper
    return func_1

@decorator4(home='wuhan')
def test4(n1,n2,n3):
    print("原有功能")
    print(n1+n2+n3)

# test3(1,2,3)=decorator3(home="武汉")(test(1,2,3))()
"""
1-先调用decorator3(home="wuhan")
2-执行func_1(test(1,2,3)) # 到这里其实就和前面的装饰器一样
3-执行wrapper
4-执行test(1,2,3)
"""
test4(1,2,3)

python中的*args与**kwarsg以及闭包和装饰器_第1张图片

你可能感兴趣的:(python,python)