装饰器:

#模板
def auth(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper

#遵循开放封闭原则:对扩展是开放的,对修改是封闭的。

#装饰器本身可以可以是任意可调用的对象,被装饰的对象本身也可以是任意可以调用的对象。

#装饰器遵循的原则:

  1,不修改被装饰对象的源代码

  2,不修改被调用对象的调用方法

#装饰器的目的:

  在遵循1和2的原则的前提下,为其他函数添加新功能

#定义了一个函数,想在原函数的基础上增加一个统计函数运行时间的功能
import time
def index():
print('Welcome to index')
index() #首先用这个解决方式,这种方式不满足装饰器不改变原函数的规则
def wrapper(func):
start=time.time()
func()
stop=time.time()
print('run time is %s' %(stop-start))
wrapper(index)

利用下面这种方法,可以解决问题:

import time
def index():
time.sleep(3)
print('Welcome to index') def timmer():
func=index
def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s' %(stop-start))
return wrapper index=timmer() index()

但是如果说想要添加多个功能的时候,我们需要将func=index这行注释:

import time
def index():
time.sleep(3)
print('Welcome to index') def home():
time.sleep(3)
print('Welcome to home') def timmer():
#func=index
def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s' %(stop-start))
return wrapper index=timmer(index)
home=timmer(home)
index()

我们可以将index=timmer(index)     home=timmer(home)简写

#装饰器必须要写到被装饰器的正上方,并且单独一行
def timmer():
#func=index
def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s' %(stop-start))
return wrapper #index=timmer(index)
#home=timmer(home)
@timmer
import time
def index():
time.sleep(3)
print('Welcome to index') @timmer
def home():
time.sleep(3)
print('Welcome to home') index()

被装饰对象是有参函数:

要让装饰器的函数能够适应各种有参,无参,多参的函数。

我们可以再装饰其中加入(*args,**kwargs)

def timmer():
#func=index
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-start))
     return res
return wrapper #index=timmer(index)
#home=timmer(home)
@timmer
import time
def index():
time.sleep(3)
print('Welcome to index')
  return 123 @timmer
def home():
time.sleep(3)
print('Welcome to home')

#如果函数里边有返回值,例如我们在index()函数中有返回值,我们需要在上面的装饰器里边在定义一层,
res=func(),在结尾返回一个return res
index()

实现认证功能的装饰器:

def auth(func):
def wrapper(*args,**kwargs):
name=input('input your name').strip()
password=input('input your password').strip()
if name == 'yangshuai' and password == '123':
res=func(*args,**kwargs)
return res
else:
print('login failed')
return wrapper @auth
def index():
print("login successful") index()

6-15:11

Day4_装饰器的更多相关文章

  1. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  2. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  3. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  4. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  5. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  6. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

  7. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

  8. python --> 递归 以及装饰器

    一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数 ...

  9. python 装饰器的理解

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

随机推荐

  1. SDL2源代码分析8:视频显示总结

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  2. 【VSTS 日志】TFS 2015 Update 1 发布 – Git和TFVC代码库可以混合使用了

    Visual Studio Team Foundation Server 2015 Update 1已经发布了. 这是 Team Foundation Server (TFS) 的最新版本,是 Mic ...

  3. 精通CSS+DIV网页样式与布局--页面背景

    上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...

  4. 多态原理探究-从C++编译器角度理解多态的实现原理

    理论知识: 当类中声明虚函数时,编译器会在类中生成一个虚函数表. 虚函数表是一个存储类成员函数指针的数据结构. 虚函数表是由编译器自动生成与维护的. virtual成员函数会被编译器放入虚函数表中. ...

  5. Cocos2D:塔防游戏制作之旅(十八)

    在Enemy.m的getDamaged:方法只给你添加如下1行(在if条件内): [theGame awardGold:200]; 现在运行游戏你将注意到你不能放置超出你资源金币的炮塔了.当然杀死敌人 ...

  6. 1. MariaDB简介

    作者: 铁锚 日期: 2013年9月21日 官方博客地址:https://mariadb.org/ 官网地址: https://mariadb.com/ 百度百科地址: http://baike.ba ...

  7. 数据结构-自平衡二叉查找树(AVL)详解

    介绍: 在计算机科学中,AVL树是最先发明的自平衡二叉查找树. 在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树. 查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  8. Linux进程-命令行参数和环境列表

    命令行参数 在C中,main函数有很多的变种,比如 main(), int main(), int main(int argc, char *argv[]), int main(int argc, c ...

  9. H5 学习之旅-H5表格(7)

    表格语法 table:简历表格 captian:表格标题 th:表格行表头 tr:表格行 td:单元格 thead:表格页眉 tfoot:表格页脚 tbody:表格主体 col:列属性 !!!代码实例 ...

  10. 【一天一道LeetCode】#52. N-Queens II

    一天一道LeetCode系列 (一)题目 Follow up for N-Queens problem. Now, instead outputting board configurations, r ...