欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 语句中我们返回 greetwelcome,而不是 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!