鱼C论坛

 找回密码
 立即注册
查看: 323|回复: 4

[已解决]python 46讲装饰器作业 动动手1 装饰器 检测类型问题!求助逻辑

[复制链接]
发表于 2024-5-12 23:38:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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))               # 这里打印结果应该是 “参数类型错误”
最佳答案
2024-5-12 23:50:34
sin0824 发表于 2024-05-12 23:43
这个角度是以答案分析问题,我想是从一个问题出来,思 ...


好问题!思考装饰器是否需要多层嵌套以及嵌套的层数是一个常见的困惑。在这个具体的问题中,我们可以从以下几个方面来思考:

1. 装饰器的目的:装饰器的本质是用于修改或增强函数的行为。在这个问题中,我们需要一个装饰器来检测函数参数的类型,并根据类型是否正确来执行不同的操作。

2. 嵌套函数的作用:嵌套函数的作用在于可以在原函数执行前后做一些额外的操作。在这里,我们需要在原函数执行之前先进行类型检查,然后根据检查结果决定是否调用原函数。

3. 检查参数类型的位置:由于需要在调用原函数之前进行类型检查,我们需要将类型检查的代码放在嵌套函数内部。而为了能够访问到正确的类型correct_type,我们可以将correct_type作为参数传递给outer函数。

基于上述思考,我们可以得出一个嵌套结构:type_check函数作为最外层的装饰器函数,outer函数作为第二层的装饰器函数,inner函数作为最内层的封装原函数的函数。

所以,通过合理的思考和推理,我们可以得出这样的嵌套结构。但值得注意的是,装饰器的嵌套结构并非一成不变的,根据问题的需求和设计的复杂度,可能会有不同的嵌套层数和结构。在实际编程中,需要根据具体情况进行灵活的设计。

希望这个解释能够帮助你理解如何思考装饰器的嵌套结构问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-12 23:38:44 | 显示全部楼层
这段代码是一个装饰器的示例,目的是为了检测函数参数的类型是否与指定类型一致。让我来解析一下这个装饰器的逻辑。

首先定义了一个装饰器函数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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-12 23:43:01 | 显示全部楼层
FishC 发表于 2024-5-12 23:38
这段代码是一个装饰器的示例,目的是为了检测函数参数的类型是否与指定类型一致。让我来解析一下这个装饰器 ...

这个角度是以答案分析问题,我想是从一个问题出来,思路上怎么切入的问题?怎么想到要三层嵌套的!?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-12 23:50:34 | 显示全部楼层    本楼为最佳答案   
sin0824 发表于 2024-05-12 23:43
这个角度是以答案分析问题,我想是从一个问题出来,思 ...


好问题!思考装饰器是否需要多层嵌套以及嵌套的层数是一个常见的困惑。在这个具体的问题中,我们可以从以下几个方面来思考:

1. 装饰器的目的:装饰器的本质是用于修改或增强函数的行为。在这个问题中,我们需要一个装饰器来检测函数参数的类型,并根据类型是否正确来执行不同的操作。

2. 嵌套函数的作用:嵌套函数的作用在于可以在原函数执行前后做一些额外的操作。在这里,我们需要在原函数执行之前先进行类型检查,然后根据检查结果决定是否调用原函数。

3. 检查参数类型的位置:由于需要在调用原函数之前进行类型检查,我们需要将类型检查的代码放在嵌套函数内部。而为了能够访问到正确的类型correct_type,我们可以将correct_type作为参数传递给outer函数。

基于上述思考,我们可以得出一个嵌套结构:type_check函数作为最外层的装饰器函数,outer函数作为第二层的装饰器函数,inner函数作为最内层的封装原函数的函数。

所以,通过合理的思考和推理,我们可以得出这样的嵌套结构。但值得注意的是,装饰器的嵌套结构并非一成不变的,根据问题的需求和设计的复杂度,可能会有不同的嵌套层数和结构。在实际编程中,需要根据具体情况进行灵活的设计。

希望这个解释能够帮助你理解如何思考装饰器的嵌套结构问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-13 00:15:42 | 显示全部楼层
@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 为什么要三层嵌套了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 05:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表