python装饰器原理
程序员文章站
2022-07-14 09:53:36
...
装饰器原理
简而言之:是修改其他函数的功能的函数
一切皆对象
例子:def 的函数是一个对象
def hi(name="yasoob"):
return "hi " + name
print(hi())
# output: 'hi yasoob'
# 我们甚至可以将一个函数赋值给一个变量,比如
greet = hi
# 我们这里没有在使用小括号,因为我们并不是在调用hi函数
# 而是在将它放在greet变量里头。我们尝试运行下这个
print(greet())
# output: 'hi yasoob'
# 如果我们删掉旧的hi函数,看看会发生什么!
del hi
print(hi())
#outputs: NameError
print(greet())
#outputs: 'hi yasoob'
了解装饰器之前需要了解的几个概念
在函数中定义函数
简而言之:python支持在一个函数中定义另一个函数
从函数中返回函数
简而言之:函数可以返回函数
其实并不需要在一个函数里去执行另一个函数,我们也可以将其作为输出返回出来:
def hi(name="yasoob"): def greet(): return "now you are in the greet() function" def welcome(): return "now you are in the welcome() function" if name == "yasoob": return greet else: return welcome a = hi() print(a) #outputs: <function greet at 0x7f2143c01500> #上面清晰地展示了`a`现在指向到hi()函数中的greet()函数 #现在试试这个 print(a()) #outputs: now you are in the greet() function
再次看看这个代码。在
if/else
语句中我们返回greet
和welcome
,而不是greet()
和welcome()
。为什么那样?这是因为当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。你明白了吗?让我再稍微多解释点细节。
当我们写下
a = hi()
,hi()
会被执行,而由于name
参数默认是 yasoob,所以函数greet
被返回了。如果我们把语句改为a = hi(name = "ali")
,那么welcome
函数将被返回。我们还可以打印出hi()()
,这会输出 now you are in the greet() function。
将函数作为参数传递给另一个函数
def hi(): return "hi yasoob!" def doSomethingBeforeHi(func): print("I am doing some boring work before executing hi()") print(func()) doSomethingBeforeHi(hi) #outputs:I am doing some boring work before executing hi() #hi yasoob!