一、 基础
在了解装饰器时,首先我们要复习一下装饰器会用到的基础知识
1. 函数本身与函数调用区别(foo与foo()区别) def foo(): print("hello world") >>> s = foo # 将函数本身去赋值给s >>> type(s) #我们去查看s类型,是一个函数类型 <class ‘function‘> >>> s() # 而且s是和foo本身一样,具有执行函数的功能 hello world >>> s2 = foo() # 将foo函数执行结果赋值给s2,而在这里foo函数已经被执行 hello world >>> print (s2) # 而我们看我们定义的函数,并没有返回值,所以S2什么都没有(None) None
2. 当有多个重名函数时,Python是把后定义的覆盖之前定义的 def foo(): print("hello") def foo(): print("world") >>> foo() world
二、装饰器
首先我们了解下装饰器是个什么功能
装饰器主要功能就是给已经写好的模块,函数增加一些功能,但是不改变原有模块代码
# 装饰器 def outer(func): def inner(*args, **kwargs): print(‘log‘) ret = func(*args, **kwargs) print(‘end‘) return ret return inner @outer def f1(arg,arg3): print(arg,arg3) return ‘xx‘ >>> f1(2,3) log 2 3 end ‘xx‘ # 装饰器使用 # @ + 函数名 # 功能: # 1. 自动执行outer函数并且将其函数名f1当其参数传递 # 2. 将outer函数的返回值,重新赋值给f1
# 按照上例,@符省略了一系列的动作,我们把@符号摘出来,代码就是这样的 # 伪装饰器 def outer(func): def inner(*args, **kwargs): print(‘log‘) ret = func(*args, **kwargs) print(‘end‘) return ret return inner def f1(arg,arg3): print(arg,arg3) return ‘xx‘ f1 = outer(f1) # ① f1(2,3) # ②# output:
log
2 3
end
‘xx‘
# 特别注意我这里函数有没有括号(被不被调用) # 其实就两个重要部分 # ①. 将函数以参数方式传入outer函数中,并将outer返回值重新赋给f1 # - 而outer返回值为嵌套的inner(注意代码中也没有括号),f1 = inner # ②. 重新执行被“装饰”过的f1函数# 装饰器的@符仅仅做了①的操作,而我们真正实现“装饰”操作的还是做了一个巧妙地嵌套函数(outer),# 它的主要功能就是以上的亮点,结合装饰器和我的“伪装饰器”代码,多次对比很容易看的懂
时间: 2024-10-09 23:13:26