1.装饰器:本质是函数,是用来给其他函数添加附加扩展功能的函数,其返回值是一个函数(函数指针)

2.装饰器作用:不改变函数源代码和函数调用方式的前提下添加函数的附加功能。

3.装饰器储备知识点:

  A.高阶函数

  B.嵌套函数(闭包函数)

  C.“函数即变量”

4.装饰器函数的外部函数传入要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。

    实质: 是一个函数

    参数:是你要装饰的函数名(并非函数调用

    返回:是装饰好的函数名(也非函数调用

    作用:为已经存在的对象添加额外的功能

    特点:不需要对对象做任何的代码上的变动

5.装饰器分类:例子

  A.一般装饰器(函数内调用另一个函数)

   


import time
def decorator(function): #计算出函数function运行时间
start_time=time.time()
function()
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time) def test(): #测试函数
print('in the test') decorator(test) #调用装饰器 执行结果如下:

  B.简单装饰器

import time
def decorator(function): #计算出函数function运行时间
start_time=time.time()
function()
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
@decorator #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(): #测试函数
print('in the test') test #调用被装饰函数 执行结果如下:

3.被装饰函数带一个参数的装饰器



import time
def decorator1(function): #计算出函数function运行时间
def decorator2(x): #参数代入
start_time=time.time()
function(x) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator2 #返回decorator,此处人的理解是调用decorator1返回decorator2的引用 @decorator1 #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(args): #测试函数
print('in the test',args) test("argument") #调用被装饰函数,此处实参为字符串argument 执行结果:

4.被装饰函数带多个或者不确定参数个数的装饰器:此处回顾函数参数调用的内容(*args,**kwargs)

import time
def decorator1(function): #计算出函数function运行时间
def decorator2(*args,**kwargs): #参数代入
start_time=time.time()
function(*args,**kwargs) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator2 #返回decorator,此处本的理解是两个嵌套函数的逐个调用 @decorator1 #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(args1,args2): #测试函数
print('in the test',args1,args2) test('multiple','argument') #调用被装饰函数,此处实参为字符串argument 执行结果:

5.自身带参数的装饰器


import time
def decorator1(args1): #args1作用于装饰器decorator1内部
def decorator2(args2): #
def decorator3(*args,**kwargs): #参数代入
start_time=time.time()
for i in range(args1): #args1作用于此
args2(*args,**kwargs) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator3 #返回decorator3,此处人的理解是返回decorator3的引用
return decorator2 #返回decorator2,此处人的理解是返回decorator2的引用 @decorator1(3) #被装饰函数定义之前加入@decorator,之后可以直接调用被装饰函数。
def test(args1,args2): #测试函数
print('in the test',args1,args2) test('multiple','argument') #调用被装饰函数,此处实参为字符串argument 执行结果:
 

6.多个装饰器使用:


import time
def decorator1(x): #args1作用于装饰器decorator1内部
def decorator2(args2): #
def decorator3(*args,**kwargs): #参数代入
start_time=time.time()
for i in range(x): #args1作用于此
args2(*args,**kwargs) #参数代入,此处参数名必须与上一步参数名一样
stop_time=time.time()
run_time=start_time-stop_time
print("function runs %s"%run_time)
return decorator3 #返回decorator3,此处人的理解是返回decorator3的引用
return decorator2 #返回decorator2,此处人的理解是返回decorator2的引用 def decorator4(funct):
def decorator5(*args,**kwargs):
print('-------------decorator4 start-------------')
funct(*args,**kwargs)
print('------------decoratoe4 end here----------')
print('\n')
return decorator5 @decorator1(3) #此处的decorator1装饰了下面的的整体
@decorator4 #此处的decorator4装饰了test
def test(args1,args2): #测试函数
print('in the test',args1,args2) test('multiple','argument') #调用被装饰函数,此处实参为字符串argument

执行结果:

注:A.使用参数时要理解每一个参数代入的量(被装饰函数还是一般参数)

  B.多个装饰器嵌套使用尤其要注意装饰的顺序和层次

###新手小白,请多多指正

python装饰器小计的更多相关文章

  1. Python装饰器小代码

    # coding=utf-8import timedef outer(fun): def inner(): start = time.time() fun() runtime = time.time( ...

  2. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  3. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  4. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

  5. 一篇关于Python装饰器的博文

    这是一篇关于python装饰器的博文 在学习python的过程中处处受阻,之前的学习中Python的装饰器学习了好几遍也没能真正的弄懂.这一次抓住视频猛啃了一波,就连python大佬讲解装饰器起来也需 ...

  6. python 装饰器 一篇就能讲清楚

    装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...

  7. Python 装饰器(Decorator)

    装饰器的语法为 @dec_name ,置于函数定义之前.如: import atexit @atexit.register def goodbye(): print('Goodbye!') print ...

  8. Python装饰器探险

    关于python装饰器的理解和用法,推荐廖雪峰老师和这一篇博客以及知乎 以下代码均已手动敲过,看完本篇内容,包你装饰器小成! 装饰器实际上就是为了给某程序增添功能,但该程序已经上线或已经被使用,那么就 ...

  9. Python装饰器的通俗理解

    转载:http://blog.csdn.net/u013471155 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略 ...

随机推荐

  1. (NO.00001)iOS游戏SpeedBoy Lite成形记(一)

    这是本猫第一个原创iOS游戏,留此为证!看编号貌似要写9万多个,千锤百炼还是太少吧!? ;) 这是一个赛跑游戏,几位选手从起点跑到终点看谁用的时间最少.现在需要实现的功能是: 1.8位选手从起点移动至 ...

  2. Windows7 64位机上,OpenCV中配置CUDA,实现GPU操作步骤

    原文地址:http://blog.csdn.net/haorenka2010/article/details/24385955 按语:首先感谢http://blog.csdn.net/fengbing ...

  3. 为什么选择Nginx

     Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这 ...

  4. SpriteBuilder中物理对象能否被缩放

    我前面早些时候提到物理形状不能被缩放. 现在我却说可以缩放它们,这是为啥呢? 好吧,拥有物理物体节点的缩放属性真心不能被动画化或改变在运行的时候; 但是你可以在SpriteBuilder中设置启用物理 ...

  5. Gradle 1.12用户指南翻译——第三十二章. JDepend 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  6. HBase表重命名

    hbase shell> disable 'tableName' hbase shell> snapshot 'tableName', 'tableSnapshot' hbase shel ...

  7. PS 滤镜算法原理——浮雕效果

    clc; clear all; Image=imread('4.jpg');Image=double(Image);p=3;  %% 控制浮雕的强度 %% 控制浮雕的方向 H=[0 0 p      ...

  8. MongoDB之Java测试代码(DAO层)

    MongoInit.java是数据库初始化及连接类 MongoUtils.java是对mongodb的各种操作方法 MongoInit.java package com.wlwcloud.datate ...

  9. JVM学习--(四)垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...

  10. 01_Linux学习_基础知识

    学Linux就学命令行 === cd / 转到根目录,相对当前路径 cd dev 转到dev目录 whoami 查阅当前用户 pwd 查阅当前目录 ls 查阅当前目录下的目录和文件 === Linux ...