Python的装饰器

ⅰ亾dé卋堺 提交于 2020-04-01 12:13:15

装饰器

1、装饰器的知识点储备

"""
1、*args,**kwargs:形参中的作用汇总:*args是元组形式,**kwargs字典形式
2、*args,**kwargs:实参中的作用展开:
"""
# 一、储备知识
# 需求:我们要把传给wrapper的参数,原封不动的转嫁给index函数
# 1、*args和**kwargs
# def index(x,y):
#     print(x,y)
# def wrapper(*args,**kwargs): # 形参中汇总: *args=(1,2,3,4,5),**kwargs={"a":1,"b":2}
#     index(*args,**kwargs)  # 实参中展开:  index(*(1,2,3,4,5),**{"a":1,"b":2})
                           # index(1,2,3,4,5,a=1,b=2)

# wrapper(1,2,3,4,5,a=1,b=2)  # 只要语法不错就可随意传,但是此处运行后会报错,因为index(x,y)
                            # TypeError: index() got an unexpected keyword argument 'a'
# wrapper(1,y=2)
# wrapper(y=2,x=1)

# 2、名称空间与作用域:名称空间的“嵌套”关系实在函数定义阶段,即检测语法的时候确定的。
# 名称空间的特点:不同的名称空间内可以存放相同的名称
# 3、函数对象:
#       可以把函数当作参数传入。
#       可以把函数当作返回值返回。
# def index():
#     return 123
# def foo(func):
#     return func
#
# foo(index)  # 把函数当作参数传入

# 4、函数的嵌套定义:在一个函数内我可以在包一个函数
# def outter(func):
#     def wrapper():
#         pass
#     return wrapper  # 我要用到函数对象就不用加(),加括号就会得到返回值。

# 5、闭包函数:闭合在一个函数内
# def outter():
#     x = 111
#     def wrapper():
#         print(x)  # 包函数要访问外层的一个变量
#     return wrapper
# f = outter()   # f为全局变量,值来自闭包函数内的wrapper内存地址

# 思考一下函数是否被回收了?f = outter()应用到了wrapper所以没有被引用到。
# def f1():
#     x=1
#     y=2
#     z=3
#
#     def f2():
#         print(x)
#         print(y)
#         print(z)
#
#     f2()
# f1()

# 总结:两种传参的方式
# 方式一:通过函数的形式为函数体传值。
# 方式二:通过闭包的方式为函数体传值。

# 方式一实例:
# def wrapper(x):
#     print(x)
#
# wrapper(1)
# wrapper(2)
# wrapper(3)

# 方式二实例:如果不能使用方式一,那么我们就要考虑使用闭包函数。
def outter(x):
    # x = 1
    def wrapper():
        print(x)

    return wrapper  # outter内的wrapper那个函数的内存地址

wrapper = outter(1)  # 得到的是一个内存地址,在不同的名称空间内,名字相同
wrapper()  # 得到一个结果

 方式二实例,如下图所示:

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!