Python装饰器(Decorator)完全指南-基础篇

Decorator基本指南

前提知识

Python中的闭包(closure)

所谓闭包,指的是附带数据的函数对象。关于闭包的详解,请参阅我的另一篇文章

Python中函数也是对象

要想理解装饰器,我们首先必须明确一个概念,那就是Python中的函数(function)也是对象,可以被作为参数传递,可以被赋值给另一个变量,等等。如下例子说明了这一点。

def shout(word='yes'):
    return word.capitalize() + '!'

print(shout())
# output: 'YES!'

# 函数作为一个对象,你也可以将其赋值给另一个变量,就像任何其他我们熟知的对象一样
scream = shout
print(scream())
# output: 'YES!'

# 除此之外,即使原本的函数变量`shout`被删除了,通过赋值得到的新变量`scream`还是能够被用来正常调用该函数
del shout
print(shout())
# NameError: name 'shout' is not defined

print(scream())
# output: 'YES!'

Python中一个函数可以被定义在另一个函数内部

同时,在python中,我们也可以在一个函数内部定义另一个函数。如下面例子所示。

def talk():
    # 在函数中定义另一个函数
    def whisper(word='yes'):
        return word.lower() + '...'

    # 然后我们可以在函数中调用这个新定义的函数
    print whisper()

# 然后我们可以调用`talk`函数,该函数每次都动态地定义一个`whisper`函数,接着`talk`函数又调用了新定义的`whisper`函数
talk()
# output: 'yes...'

# 但是在`talk`函数之外并不存在一个`whisper`函数

whisper()
# NameError: name 'whisper' is not defined

那么,根据以上两个小结的知识,我们知道python中的函数也是对象,因此:

  1. python中的函数可以被赋值给另一个变量。
  2. python中的函数可以非常灵活地在各种位置被定义,包括另一个函数内部。

因而我们甚至可以把一个函数作为另一个函数的返回值。如下面的例子所示。

def get_talk(return_type='shout'):
    # 我们在这一函数中动态定义另外一些函数
    def shout(word='yes'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值