【python】——基础知识:装饰器

简单的说,装饰器就是 函数的函数
正常来说,我们定义一个函数的函数通常是这样的:

# 定义一个函数的函数
def Func4func(func):
    def printf(input):  # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
        return func() + ' in Func4func'+' with [input]:\t' + input
    return printf

# 定义一个函数
def func():
	meg = 'i am a function'
	print(meg)
	return meg

# 用Func4func来装饰func,注意是传入函数func而不是函数运行后结果func()
decorated_func = Func4func(func)
# 装饰后的函数实际上是printf(input)
print(decorated_func('haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]:	haha

装饰器使用 @ 标识符可以把上面的调用简化,简化后就变成了这样:

# 定义一个函数的函数
def Func4func(func):
    def printf(input):  # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
        return func() + ' in Func4func'+' with [input]:\t' + input
    return printf

# 用Func4func来装饰func
@Func4func
def func(): # 定义一个函数
	meg = 'i am a function'
	print(meg)
	return meg

# func在被Func4func装饰之后,实际上等价于上面的decorated_func,所以现在的func实际上是Func4func(func),因此需要传入input参数。
print(func('haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]:	haha

更进一步,装饰器函数(函数的函数)也可以定义它的参数:

# 定义一个函数的函数,这个函数带参数。
def Func4func_wi_parameter(para):  # 在原来的Func4func外面再嵌套一层Func4func_wi_parameter(para),其中para就是参数。
    def Func4func(func):
        def printf(input):  # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
            return func() + ' in Func4func'+' with [input]:\t' + input + ' and [Para]:\t'+para
        return printf
    return Func4func # 返回函数Func4func而不是函数运行后的结果Func4func()

# Func4func_wi_parameter(para)传入参数后,返回值是Func4func,所以实际上还是用Func4func来装饰func
@Func4func_wi_parameter('parameter666666')
def func(): # 定义一个函数
	meg = 'i am a function'
	print(meg)
	return meg

print(func('haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]:	haha and [Para]:	parameter666666

如果func是带参数的,也可以通过下面方法输入参数:

# 定义一个函数的函数,这个函数带参数。
def Func4func_wi_parameter(para):  # 在原来的Func4func外面再嵌套一层Func4func_wi_parameter(para),其中para就是参数。
    def Func4func(func):
        def printf(meg:str, input:str):  # 由于Func4func的return是这个printf,所以之后被装饰后的func的输入参数是 input。
            return func(meg) + ' in Func4func'+' with [input]:\t' + input + ' and [Para]:\t'+para
        return printf
    return Func4func # 返回函数Func4func而不是函数运行后的结果Func4func()

# Func4func_wi_parameter(para)传入参数后,返回值是Func4func,所以实际上还是用Func4func来装饰func
@Func4func_wi_parameter('parameter666666')
def func(meg:str='???'): # 定义一个函数
    print(meg)
    return meg

print(func('i am a func','haha')) # 'haha'实际上是 Func4func中的 printf()的input。
输出结果:
i am a function
i am a function in Func4func with [input]:	haha and [Para]:	parameter666666
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章