装饰器就是闭包函数的一种应用场景

一、为何要用装饰器

开放封闭原则:软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
       也就是说我们必须找到一种解决方案:能够在不修该一个功能源代码以及调用方式的前提下,为其加上新功能
       上述总结,原则如下:
                1、不修改源代码
                2、不修改调用方式
        目的:
            在遵循1和2原则的基础上扩展新功能

二、什么是装饰器

器指的工具,装饰指的是为被装饰对象添加新功能

完整含义:
        装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能

装饰器与被装饰的对象均可以是任意可调用的对象

装饰器=》函数

被装饰的对象=》函数

三、无参装饰器

#无参装饰器模板
def outer(func):
def inner(*args,**kwargs):
res=func(*args,**kwargs)
return res
return inner
 ###现在我们要查看指令执行的时间
#以前实现的方式
#违反了装饰器的原则---》不修改源代码
import time #导入时间模块 def index():
start_time=time.time()       #现在时间
time.sleep(3)              #暂停3s
print('welcome to index page')    
stop_time=time.time()          #现在的时间(time.sleep与print执行完后的时间)
print('run time is %s' %(stop_time-start_time)) index() #调用函数 #修订1
#没有违背原则,但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复
import time def index():
time.sleep(3)
print('welcome to index page') start_time=time.time()
index()
stop_time = time.time()
print('run time is %s' % (stop_time - start_time)) #但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复 import time def index():
time.sleep(3)
print('welcome to index page') def home(name):
time.sleep(5)
print('welcome %s to home page' %name) start_time=time.time() #代码重复
index()
stop_time = time.time()      #代码重复
print('run time is %s' % (stop_time - start_time)) #代码重复 start_time=time.time()
home('egon')
stop_time = time.time()
print('run time is %s' % (stop_time - start_time)) #修订2 # 修改了原函数的调用方式 import time def index():
time.sleep(3)
print('welcome to index page') def home(name):
time.sleep(5)
print('welcome %s to home page' %name) def wrapper(func): #func=index
start_time=time.time()
func() #index()
stop_time = time.time()
print('run time is %s' % (stop_time - start_time)) wrapper(index) # 修改了原函数的调用方式 #修订3 import time def index():
time.sleep(3)
print('welcome to index page') def outter(func): #func=最原始的index
# func=最原始的index
def wrapper():
start_time=time.time()
func()
stop_time=time.time()
print(stop_time-start_time)
return wrapper index=outter(index) # 新的index=wrapper index() #wrapper()

无参装饰器

四、无参装饰器升级版

import time

def index():
time.sleep(1)
print('welcome to index page')
return 122 def home(name):
time.sleep(2)
print('welcome %s to home page' %name) #==============装饰器
def timmer(func):
#func=最原始的home
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs) #调用最原始的home
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper index=timmer(index) # 新的index=wrapper
home=timmer(home) #新的home=wrapper
# ========================================== # res=index() #res=wrapper()
# print(res) home(name='egon') #wrapper('egon')
index() #wrapper()

五、装饰器语法

#就是一个@调用某个装饰器

import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print(stop_time-start_time)
return res
return wrapper @timmer #index=timmer(index) #语法调用方式
def index():
time.sleep(1)
print('welcome to index page')
return 122 @timmer # home=timmer(home) #语法调用方式
def home(name):
time.sleep(2)
print('welcome %s to home page' %name) # index()
home('egon')

六、认证装饰器实现

七、叠加多个装饰器

八、有参数装饰器

Python之旅:装饰器的更多相关文章

  1. python高级之装饰器

    python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...

  2. [python基础]关于装饰器

    在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...

  3. python笔记 - day4-之装饰器

                 python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...

  4. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  5. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  6. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  7. 第二篇:python高级之装饰器

    python高级之装饰器   python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...

  8. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  9. Python进阶之装饰器

    函数也是对象 要理解Python装饰器,首先要明白在Python中,函数也是一种对象,因此可以把定义函数时的函数名看作是函数对象的一个引用.既然是引用,因此可以将函数赋值给一个变量,也可以把函数作为一 ...

  10. Python的property装饰器的基本用法

    Python的@property装饰器用来把一个类的方法变成类的属性调用,然后@property本身又创建了另一个装饰器,用一个方法给属性赋值.下面是在类中使用了@property后,设置类的读写属性 ...

随机推荐

  1. request,logging,ConfigParser——接口框架

    做一个将参数和用例分开放置,并且输出log的接口测试框架 我的框架如下所示 Log文件用来设置log输出文件,需要时可以在用例内调用输出,config用来填写一切需要的参数信息,jiekou_post ...

  2. 最短路径算法(I)

    弗洛伊德算法(Floyed-Warshall) 适用范围及时间复杂度 该算法的时间复杂度为O(N^3),适用于出现负边权的情况. 可以求取最短路径或判断路径是否连通.可用于求最小环,比较两点之间的大小 ...

  3. Numpy入门笔记第二天

    # 数组的组合 import numpy as np arr1 = np.arange(5) arr2 = np.arange(3) print arr1 print arr2 [0 1 2 3 4] ...

  4. 152.[LeetCode] Maximum Product Subarray

    Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...

  5. 《数据结构与算法JavaScript描述》中的一处错误

    最近在看<数据结构与算法JavaScript描述>这本书,看到选择排序这部分时,发现一个比较大的错误. 原书的选择排序算法是这样的: function selectionSort() { ...

  6. win2008 r2 开启TLS1.2

    Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityPr ...

  7. USACO 1.3.2 Barn Repair 修理牛棚(贪心)

    Description 在一个夜黑风高,下着暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 剩下的牛一个紧挨着另一个被排成一行来过夜. 有些牛棚里有牛,有些没 ...

  8. Scrum立会报告+燃尽图(Beta阶段第二周第二次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2410 项目地址:https://coding.net/u/wuyy694 ...

  9. 《linux内核与分析》第三周

    20135130王川东 实验:构造一个简单的Linux系统的MenuOS 命令:qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd root ...

  10. Java 数组转字符

    public static String toString(int[] arr){ String temp = ""; for(int i = 0;i<arr.length; ...