装饰器
建议先去看第十六天 再回来看装饰器
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切。
每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了。装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效。
谈装饰器前,还要先要明白一件事,Python 中的函数和 Java、C++不太一样,Python 中的函数可以像普通变量一样当做参数传递给另外一个函数
装饰器(Decorators)是 Python 的一个重要部分。
简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。 首先,让我们讨论下如何写你自己的装饰器。
这可能是最难掌握的概念之一。我们会每次只讨论一个步骤,这样你能完全理解它。
- 一切皆对象
首先我们来理解下 Python 中的函数:
def eee(name='ze'): #定义函数
return 'Eamon'+name #输出 Eamon+函数
print(eee()) #打印
#结果Eamonze
#然后我们在吧这个结果赋值给另一个变量
aa=eee
# 我们这里没有在使用小括号,因为我们并不是在调用hi函数
# 而是在将它放在greet变量里头。我们尝试运行下这个
print(aa())
del eee
#如果我们删掉 eee再来
print(eee)
#outputs: NameError
print(aa)
#outputs: 'hi yasoob'
- 在函数中定义函数
刚才那些就是函数的基本知识了。我们来让你的知识更进一步。在 Python 中我们可以在一个函数中定义另一个函数:
def eee(name='ze'):
print("be included eee()")
def tall():
return 'be included tall()'
def short():
return 'be included shor()'
print(tall())
print(short())
print("be included eee()")
eee()
# 上面展示了无论何时你调用eee(), tall()和short()将会同时被调用。
# 然后tall()和shor()函数在eee()函数之外是不能访问的,比如:
tall()
#outputs: NameError: name 'tall' is not defined
那现在我们知道了可以在函数中定义另外的函数。也就是说:我们可以创建嵌套的函数。现在你需要再多学一点,就是函数也能返回函数。
- 从函数中返回函数
其实并不需要在一个函数里去执行另一个函数,我们也可以将其作为输出返回出来:
def lol(name='yasuo'):
def lpl():
return 'UZI niubi'
def lpk():
return 'Faker niubi'
if name=='yasuo':
return lpl
else:
return lpk
a=lol()
print(a)
#outputs:<function lol.<locals>.lpl at 0x10f809f70>
print(a())
#outputs:UZI niubi
再次看看这个代码。在 if/else 语句中我们返回 lpl 和 lpk,而不是 lpl() 和 lpk()。为什么那样?这是因为当你把一对小括号放在后面,这个函数就会执行;然而如果你不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。 你明白了吗?让我再稍微多解释点细节。
当我们写下 a = lol(),lol() 会被执行,而由于 name 参数默认是 yasuo,所以函数 lpl 被返回了。如果我们把语句改为 a = lol(name = “ali”),那么 lpk 函数将被返回。我们还可以打印出 lol()(),这会输出 UZI niubi 。
- 将函数作为参数传给另一个函数
def hi():
return "hi yasuo"
def ho():
return '1'
def lol(oo):
print('i love')
print(oo()) #主要是这里的定义是关键
lol(ho)
#out:i love
1
现在已经具备初步的知识 明天学习创建第一个装饰器
作者:Eamonze
时间:2020/12/2