文档章节

Python 装饰器笔记

AllitWell
 AllitWell
发布于 2017/06/02 21:14
字数 470
阅读 27
收藏 0

今天扒了扒了Python解释器,记录下理解和遇到问题

首先是帮助理解

知乎链接,zhijun liu的讲解我觉得很给力.

然后是抛出异常

  • 来个简单的正经代码
# 首先定义装饰器
def log(func):
    def wrapper(*args, **kw):
        print('call %s star' % func.__name__)
        func(*args, **kw)

    return wrapper


# 定义一个函数并使用装饰器
@log
def foo():
    print('I am foo')
  • 我对上面代码进行思考后觉得为什么不可以写成这样,里面嵌套感觉是没有必要存在的.

# 定义一个有问题的装饰器
def log_err(func):
    print('不调用也会出现这句话')
    return func


# 定义一个使用该装饰器的函数
@log_err
def foo1():
    print('I am foo')

再然后问题描述

我对两段代码进行调试发现如果我想给foo1传入形参,修改log_err的return 就会报错,这就意味着这个写法并不通用.

其次,第一种写法print('call %s star' % func.__name__)foo的调用的时候都会输出.而在第二段代码print('call %s star' % func.__name__)即使我不调用foo1也会输出.

最后说明原因

其原因是内嵌函数是用于替代原始函数运行,而装饰器的语句是在装饰过程运行的.解释器在原始函数调用之前完成装饰的.

附录

# -*- coding: utf-8 -*-
"""
@author: 一方(AllitWell)
@contact: AllitWeller@gmail.com
@site:

@version: 1.0
@license:
@file: PyStudy1.py
@time: 2017/5/31 8:21

"""


# 首先定义装饰器
def log(func):
    def wrapper(*args, **kw):
        print('call %s star' % func.__name__)
        func(*args, **kw)

    return wrapper


# 定义一个函数并使用装饰器
@log
def foo():
    print('I am foo')


# 定义一个有问题的装饰器
def log_err(func):
    print('不调用也会出现这句话')
    return func


# 定义一个使用该装饰器的函数
@log_err
def foo1():
    print('I am foo')


if __name__ == '__main__':
    foo()
 #   foo1()

 

© 著作权归作者所有

AllitWell
粉丝 0
博文 2
码字总数 1105
作品 0
私信 提问
python 面向对象高级编程之使用@property

python学习笔记,特做记录,分享给大家,希望对大家有所帮助。 使用@property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:...

展菲
07/07
0
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
2018/07/22
11
0
Python知识点:理解和使用装饰器 @decorator

我在我的个人博客“猿人学网站”和公众号“猿人学Python”上写Python教程,有兴趣的可以关注公众号和网站。 Python的装饰器(decorator)是一个很棒的机制,也是熟练运用Python的必杀技之一。...

呆木木人儿
03/12
1K
3
一份来自 StackOverflow 的最佳 Python 装饰器教程

(给Python开发者加星标,提升Python技能) 翻译:可乐,校对:艾凌风 发布:Python开发者(id:PythonCoder) 注意: 这是一篇 StackOverflow 上的问题回答,因为这个回答很棒,所以我把它存...

Python开发者
04/25
0
0
Python的装饰器原来是这么用的

公众号:pythonislover Python的装饰器,是一个Python中一个比较难以理解的知识点, 今天我试试说一说,说的如果不好,请见谅。 装饰器,从字面意思来说,就是修饰一个事物的,在Python里面的...

南山yrg
04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

队列-顺序(c/c++实现)

队列是在线性表功能稍作一改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。 队列(顺序)实现的三个步骤: 定义所需的功能(...

白客C
21分钟前
5
0
安装tomcat部署网站/nginx代理tomcat/tomcat部署多个网站

来源:https://blog.csdn.net/Powerful_Fy 安装jdk: Oracle官方下载 https://www.oracle.com/technetwork/java/javase/downloads/index.html yum安装openjdk: 1.查找可使用的jdk包: [roo......

asnfuy
29分钟前
3
0
Linux 安装 Android studio

官网下载linux 版本 android xxxxx-xxxx.tar.gz 然后 找到它 解压缩 得到 android-studio文件夹 执行 [root@monkey java]# mv ./android-studio /opt [root@monkey java]# cd /opt/android-s......

MrLins
31分钟前
5
0
VMware vSphere虚拟机的迁移

VMware vSphere 6.7下,虚拟机的迁移按照移动的内容,可以分为4种: 1)冷迁移(cold migration) 2)热迁移(vMotion) 3)存储热迁移(storage vMotion) 4)完全热迁移(shared-nothing ...

大别阿郎
32分钟前
4
0
SpringCloud——Docker部署eureka集群

Docker部署eureka集群 一、环境准备 1.docker环境 centos7下的安装:https://www.jianshu.com/p/ec02810d6a2b docker常用命令:https://www.jianshu.com/p/af7977b1075c 没有用过docker的最好......

devils_os
32分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部