|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
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)) # 这里打印结果应该是 “参数类型错误”
这段代码如何直白的理解,看不懂执行的逻辑
本帖最后由 jackz007 于 2024-1-27 22:34 编辑
- def type_check(correct_type) : # 闭包,完成预设指定类型 (int、str) 的传递
- def outer(func): # 闭包,完成被装饰函数(在本例中是 double()、upper())的传递
- def inner(arg): # 内嵌函数,当以参数 arg 调用 double()、upper() 时,调用被转向到本函数,
- # 并会以 arg 为参数调用本函数
- if(type(arg) == correct_type): # 检查参数 arg 的类型是否符合预设的参数类型(int、str)
- return func(arg) # 如果符合,就返回对 double(arg) 或 upper(arg) 的调用结果
- else: # 否则
- return "参数类型错误!" # 给出参数类型错误,并不执行被装饰函数 double() 或 upper()
- return inner # 内层闭包,主要负责传递被装饰函数 double()、upper() 调用句柄以及内嵌函数 inner() 的调用句柄
- return outer # 外层闭包,主要负责传递预设参数类型及内嵌闭包 outer() 调用句柄
-
- @type_check(int) # 声明函数 type_check() 用于装饰函数 double(),以便在代码中调用
- # 函数 double() 时,由 type_check() 的内嵌函数 inner() 获得控制
- # 并由 inner() 完成对原始函数 double() 的调用。type_check(int)
- # 中的形式参数 int 是要求的参数类型,就是 double(arg) 中所要求的
- # 输入参数 arg 的类型
- def double(x):
- return x * 2
-
- @type_check(str) # 声明函数 type_check() 用于装饰函数 upper(),以便在代码中调用
- # 函数 upper() 时,由 type_check() 的内嵌函数 inner() 获得控制
- # 并由 inner() 完成对原始函数 upper() 的调用。type_check(str)
- # 中的形式参数 str 是要求的参数类型,就是 upper(arg) 中所要求的
- # 输入参数 arg 的类型
- def upper(s):
- return s . upper()
- print("<<<--- 测试整数 --->>>")
- print(double(2))
- print(double("2"))
- print("<<<--- 测试字符串 --->>>")
- print(upper('I love FishC.'))
- print(upper(250))
复制代码
不用装饰器的等效代码是这样的,希望能帮助楼主理解到装饰器的作用机理:
- 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
-
- def double(x):
- return x * 2
-
- def upper(s):
- return s . upper()
- print("<<<--- 测试整数 --->>>")
- print(type_check(int)(double)(2)) # 重点关注这里
- print(type_check(int)(double)("2")) # 重点关注这里
- print("<<<--- 测试字符串 --->>>")
- print(type_check(str)(upper)('I love FishC.')) # 重点关注这里
- print(type_check(str)(upper)(250)) # 重点关注这里
复制代码
|
|