理解python中的装饰器
admin
2023-07-31 00:36:30
0

python的函数是对象

要理解装饰器,首先,你必须明白,在python中,函数是对象. 这很重要.

简单例子来理解为什么

1234567891011121314151617181920212223242526 def shout(word=\”yes\”):    return word.capitalize()+\”!\” print shout()# outputs : \’Yes!\’ # 作为一个对象,你可以讲函数赋值给另一个对象scream = shout # 注意到这里我们并没有使用括号:我们不是调用函数,而是将函数\’shout\’赋给变量\’scream\’# 这意味着,你可以通过\’scream\’调用\’shout\’ print scream()# outputs : \’Yes!\’ # 不仅如此,你可以删除老的名称\’shout\’,但是通过\’scream\’依旧可以访问原有函数 del shouttry:    print shout()except NameError, e:    print e    #outputs: \”name \’shout\’ is not defined\” print scream()# outputs: \’Yes!\’

好了,记住这点,我们将会很快用到它.

Python函数另一个有趣的特性是,函数可以被定义在另一个函数里面

1234567891011121314151617181920 def talk():    # 你可以定义一个函数    def whisper(word=\”yes\”):        return word.lower()+\”…\”     # … 并且立刻调用    print whisper() # 每次当你调用\”talk\”, 都会定义\”whisper\”# 并且在\”talk\”中被调用talk()# outputs:# \”yes…\” #但是在\”talk\”外部,函数\”whisper\”不存在!try:    print whisper()except NameError, e:    print e    #outputs : \”name \’whisper\’ is not defined\”*

函数引用

好了,到这里了,接下来是有意思的部分,我们刚才看到 函数是对象,然后:

1.函数可以赋值给一个变量

2.函数可以定义在另一个函数内部

即,这也意味着一个函数可以返回另一个函数:-),让我们来看另一段代码

1234567891011121314151617181920212223242526272829303132 def getTalk(type=\”shout\”):     # 定义函数    def shout(word=\”yes\”):        return word.capitalize()+\”!\”     def whisper(word=\”yes\”) :        return word.lower()+\”…\”;     # 返回函数    if type == \”shout\”:        # 没有使用\”()\”, 并不是要调用函数,而是要返回函数对象        return shout    else:        return whisper # 如何使用? # 将函数返回值赋值给一个变量talk = getTalk() # 我们可以打印下这个函数对象print talk#outputs : function shout at 0xb7ea817c> # 这个对象是函数的返回值print talk()#outputs : Yes! # 不仅如此,你还可以直接使用之print getTalk(\”whisper\”)()#outputs : yes…

但是稍等,如果你可以返回一个函数,那么你也可以将函数作为参数传递

12345678 .

简单例子来理解为什么

1234567891011121314151617181920212223242526 def shout(word=\”yes\”):    return word.capitalize()+\”!\” print shout()# outputs : \’Yes!\’ # 作为一个对象,你可以讲函数赋值给另一个对象scream = shout # 注意到这里我们并没有使用括号:我们不是调用函数,而是将函数\’shout\’赋给变量\’scream\’# 这意味着,你可以通过\’scream\’调用\’shout\’ print scream()# outputs : \’Yes!\’ # 不仅如此,你可以删除老的名称\’shout\’,但是通过\’scream\’依旧可以访问原有函数 del shouttry:    print shout()except NameError, e:    print e    #outputs: \”name \’shout\’ is not defined\” print scream()# outputs: \’Yes!\’

好了,记住这点,我们将会很快用到它.

Python函数另一个有趣的特性是,函数可以被定义在另一个函数里面

1234567891011121314151617181920 def talk():    # 你可以定义一个函数    def whisper(word=\”yes\”):        return word.lower()+\”…\”     # … 并且立刻调用    print whisper() # 每次当你调用\”talk\”, 都会定义\”whisper\”# 并且在\”talk\”中被调用talk()# outputs:# \”yes…\” #但是在\”talk\”外部,函数\”whisper\”不存在!try:    print whisper()except NameError, e:    print e    #outputs : \”name \’whisper\’ is not defined\”*

函数引用

好了,到这里了,接下来是有意思的部分,我们刚才看到 函数是对象,然后:

1.函数可以赋值给一个变量

2.函数可以定义在另一个函数内部

即,这也意味着一个函数可以返回另一个函数:-),让我们来看另一段代码

1234567891011121314151617181920212223242526272829303132 def getTalk(type=\”shout\”):     # 定义函数    def shout(word=\”yes\”):        return word.capitalize()+\”!\”     def whisper(word=\”yes\”) :        return word.lower()+\”…\”;     # 返回函数    if type == \”shout\”:        # 没有使用\”()\”, 并不是要调用函数,而是要返回函数对象        return shout    else:        return whisper # 如何使用? # 将函数返回值赋值给一个变量talk = getTalk() # 我们可以打印下这个函数对象print talk#outputs : function shout at 0xb7ea817c> # 这个对象是函数的返回值print talk()#outputs : Yes! # 不仅如此,你还可以直接使用之print getTalk(\”whisper\”)()#outputs : yes…

但是稍等,如果你可以返回一个函数,那么你也可以将函数作为参数传递

12345678 def doSomethingBefore(func):    print \”I do something before then I call the function you gave me\”    print func

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...