我在偷偷学python的第十三天 (高级函数之 装饰器(一))

装饰器

建议先去看第十六天 再回来看装饰器

讲 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值