python 46讲装饰器作业 动动手1 装饰器 检测类型问题!求助逻辑
本帖最后由 sin0824 于 2024-5-12 23:39 编辑装饰器 这里三层嵌套 我没看懂,能帮分析下不? 我做的时候一直都在用两层里思来想去,实在解不开,看答案,有点没搞懂
def type_check(correct_type):
def outer(func):
def inner(arg):
if(type(arg) == correct_type):
return func(arg)
else:
return "参数类型错误!"
return inner
return outer
print("<<<--- 测试整数 --->>>")
@type_check(int)
def double(x):
return x * 2
print(double(2)) # 这里打印结果应该是 4
print(double("2")) # 这里打印结果应该是 “参数类型错误”
print("\n<<<--- 测试字符串 --->>>")
@type_check(str)
def upper(s):
return s.upper()
print(upper('I love FishC.')) # 这里打印结果应该是 I LOVE FISHC
print(upper(250)) # 这里打印结果应该是 “参数类型错误” 这段代码是一个装饰器的示例,目的是为了检测函数参数的类型是否与指定类型一致。让我来解析一下这个装饰器的逻辑。
首先定义了一个装饰器函数type_check,它接受一个正确的类型correct_type作为参数。装饰器函数里面又定义了一个outer函数,并返回它。outer函数也是一个装饰器函数,它接受一个需要修饰的函数func作为参数。outer函数里面又定义了一个inner函数,用来封装原函数func。
inner函数的作用是在调用原函数之前先检查传入的参数arg的类型是否与correct_type一致。如果一致,则调用原函数并返回结果;否则,返回一个错误提示字符串"参数类型错误!"。
最后,装饰器函数type_check返回outer函数,实现了三层嵌套。
接下来,代码使用了这个装饰器来修饰了两个函数double和upper。
@type_check(int)表示将装饰器type_check应用到下面的double函数上,而且correct_type被设置为int类型。所以当调用double函数时,会先执行inner函数中的类型检查,只有参数为int类型时,才会调用原函数double,返回参数的两倍。否则,返回"参数类型错误!"。
同理,@type_check(str)表示将装饰器type_check应用到下面的upper函数上,而且correct_type被设置为str类型。所以当调用upper函数时,会先执行inner函数中的类型检查,只有参数为str类型时,才会调用原函数upper,返回参数的大写形式。否则,返回"参数类型错误!"。
希望这样的解释能够帮助你理解装饰器的作用和逻辑。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-12 23:38
这段代码是一个装饰器的示例,目的是为了检测函数参数的类型是否与指定类型一致。让我来解析一下这个装饰器 ...
这个角度是以答案分析问题,我想是从一个问题出来,思路上怎么切入的问题?怎么想到要三层嵌套的!? sin0824 发表于 2024-05-12 23:43
这个角度是以答案分析问题,我想是从一个问题出来,思 ...
好问题!思考装饰器是否需要多层嵌套以及嵌套的层数是一个常见的困惑。在这个具体的问题中,我们可以从以下几个方面来思考:
1. 装饰器的目的:装饰器的本质是用于修改或增强函数的行为。在这个问题中,我们需要一个装饰器来检测函数参数的类型,并根据类型是否正确来执行不同的操作。
2. 嵌套函数的作用:嵌套函数的作用在于可以在原函数执行前后做一些额外的操作。在这里,我们需要在原函数执行之前先进行类型检查,然后根据检查结果决定是否调用原函数。
3. 检查参数类型的位置:由于需要在调用原函数之前进行类型检查,我们需要将类型检查的代码放在嵌套函数内部。而为了能够访问到正确的类型correct_type,我们可以将correct_type作为参数传递给outer函数。
基于上述思考,我们可以得出一个嵌套结构:type_check函数作为最外层的装饰器函数,outer函数作为第二层的装饰器函数,inner函数作为最内层的封装原函数的函数。
所以,通过合理的思考和推理,我们可以得出这样的嵌套结构。但值得注意的是,装饰器的嵌套结构并非一成不变的,根据问题的需求和设计的复杂度,可能会有不同的嵌套层数和结构。在实际编程中,需要根据具体情况进行灵活的设计。
希望这个解释能够帮助你理解如何思考装饰器的嵌套结构问题!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 @type_check(str)
def upper(s):
return s.upper()
相当于
upper = type_check(str)(upper)
upper('I love FishC.') 相当于 type_check(str)(upper)('I love FishC.')
type_check(str)(upper)('I love FishC.') 刚好是三层调用
所以知道 type_check 为什么要三层嵌套了吧
页:
[1]