前言:

   装饰器用于装饰某些函数或者方法,或者类。可以在函数执行之前或者执行之后,执行一些自定义的操作。

   1、定义:装饰器就是一个函数,为新定义的函数。把原函数嵌套到新函数里面。以后就可以在执行新函数的过程中,同时执行旧函数,实现自定义操作。

装饰器的语法:

2、应用装饰器:@符号

1.1  无参数的装饰器

#装饰器架构:
def outter(func):
    def inner():
        print('hello world')
        print('hello world')
        print('hello world')
        r=func()
        print('end')
        print('end')
        print('end')
        return r
    return inner @outter
def f1():
    print('F1')
>>>
hello world
hello world
hello world
F1
end
end
end
#开放封闭原则:不在原函数的修改代码基础上,实现函数执行前后新的功能
#装饰器架构: def outter(func):
    #原来那个f1函数
    def inner():
        print('hello world')
        print('hello world')
        print('hello world')
        #原f1函数
        r=func()    #r=None  r=f1()
        print('end')
        print('end')
        print('end')
        return r        #f1=inner →f1()=inner()
    return inner
#@outter
def f1():
     print('F1') #1、执行outter函数,并且将其下面的函数名(f1)当做参数传入装饰器内:f1=func
#2、将outter的返回值,重新赋值给f1→相当于f1执行另一个函数【相当于f1=inner内存地址】所以f1()相当于执行inner()
    #新f1函数拿到一个return值:r f1=r
#总结:
# 把原函数分装到另一个函数里面。在不改变原函数的基础上。在原函数执行前,后操作其他内容。
#拆解过程
f2=outter(f1)   #f2=inner()的内存地址
result=f2()     #执行inner函数,并把返回值赋值给result
print(result)   #打印执行结果
#然后把f1进行重新赋值。f1=f2   相当于:f1执行inner函数
>>>
hello world
hello world
hello world
F1
end
end
end
None

总结:

  1、只要函数应用上装饰器,那么函数就会被重新定义,重新定义为装饰器的内层函数

  

1.2 带2个参数的装饰器

缺点:

   原函数有几个参数,装饰器就得有几个参数,很不方便。所以可以考虑引入可变参数和关键字参数。*args,**kwargs.这样可以接受无限多的参数。

这样无法满足对于参数的灵活控制。希望写一个装饰器就可以应用到多个函数。

  如果inner函数可以接收任意个参数的话,就无需其他函数强制修改为何装饰器一致参数的工作。

1.3、多个参数的装饰器

通过装饰器可变参数,可以解决大部分参数问题。

不足点:只能实现多个函数调用一个装饰器。如果一个函数调用多个装饰器?

1.4、一个函数调用多个装饰器。

1.5、装饰器流程梳理

  ①、函数应用一个装饰器

  原函数等价于→inner函数。func是原来的index函数

@outer的意思:

1、执行outer函数,将index函数作为参数传递。

2、将outter的返回值。重新赋值给index

执行流程:

单层:

做个类比:

@outter+index=inner函数

两层装饰器函数

 

python学习-day20、装饰器【图片缺失可看】印象笔记博客备份的更多相关文章

  1. python学习笔记--装饰器

    1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...

  2. python 学习分享-装饰器篇

    本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...

  3. python学习之装饰器-

    python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...

  4. python学习day14 装饰器(二)&模块

    装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...

  5. Python学习 :装饰器

    装饰器(函数) 装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能 装饰器的返回值是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等 ...

  6. python学习之-- 装饰器

    高阶函数+嵌套函数 == 装饰器 什么是装饰器: 其实也是一个函数. 功能:为其他的函数添加附加功能 原则:不能修改被装饰的函数的源代码和调用方式 学习装饰器前首先要明白以下3条事项: 1:函数 即 ...

  7. Python学习笔记--装饰器的实验

    装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...

  8. 6月4日 python学习总结 装饰器复习

    1.  装饰器的原理以及为什么要使用装饰器 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 在不影响原代码结构的情况下为其添加功能 2.  装饰器的基本 ...

  9. python学习 day13 装饰器(一)&推导式

    装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...

随机推荐

  1. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  2. jQuery 源码中的 camelCase

    先看一下源码 //65-72行 // Matches dashed string for camelizing //匹配连字符 ‘-’ 和其后的第一个字母或数字,如果是字母,则替换为大写,如果是数字, ...

  3. MYSQL中关于日期处理的函数

    < DOCTYPE HTML PUBLIC -WCDTD HTML TransitionalEN> MySQL数据库中SQL语句中 关于日期.时间\时间戳的函数   一 MySQL 获得当 ...

  4. 例子:Alarm Clock with voice Commands Sample

    通过本例子学习: 如何使用自定义字体文件(.TTF) 如何播放声音 动画的使用 Speech 设置闹铃 应用 设置 数据存储到IsolatedStorage 如何使用自定义字体文件(.TTF) < ...

  5. HBase with MapReduce (SummaryToFile)

    上一篇文章是实现统计hbase单元值出现的个数,并将结果存放到hbase的表中,本文是将结果存放到hdfs上.其中的map实现与前文一直,连接:http://www.cnblogs.com/ljy20 ...

  6. a few changes of Android 5.0

    1.Service Intent must be explicit Intent serviceIntent = new Intent(context,MyService.class);context ...

  7. hdu 2093

    ps:这题的输入我看到括号以为要用字符串,谁知道看了大神的才知道可以这样"scanf("%d(%d)",&a,&b);"  觉得好神奇.. 然后 ...

  8. Java甘特图控件swing版免费下载地址

    FlexGantt 控件是现在Java 平台下最先进的甘特图解决方案,使用一个很高的抽象层次,能适用于多种不同的域,例如 ERP 系统.生产计划和日程安排.制造流程系统或项目公文管理程序等.这些使得 ...

  9. 【Python】实现5!+4!+3!+2!+1!

    #!/usr/bin/env python #-*- coding:utf-8 -*- def factorial_add(n): empty_list=[] #定义一个空列表 for i in ma ...

  10. iOS运行时工具-cycript

    cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用.它确实可以帮助你破解一些应用,但我觉得这个工具主要还是用来学习其他应用的设计(主要是 ...