本帖最后由 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)) # 重点关注这里
|