装饰器:

#模板
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. 成员函数的const到底修饰的是谁

    demo <pre name="code" class="cpp">class Test { public: const void OpVar(in ...

  2. An universal algorithm design of fixed length substring locating

         An universal algorithm design of fixed length substring locating Stringlocating is a very commo ...

  3. 【Unity技巧】制作一个简单的NPC

    1. 写在前面 前几天看了cgcookie的一个教程,学习了下怎么根据已有人物模型制作一个仿版的NPC人物,感觉挺好玩的,整理一下放到博客里! 先看一下教程里面的最终效果. 是不是很像个幽灵~ 下面是 ...

  4. Hibernate3 Criteria对象详解

    1.序言 Hibernate框架是目前JavaEE软件开发的企业主流框架,学习Hibernate必然要掌握ORM(对象关系映射Object/Relation Mapping)的概念思想, Hibern ...

  5. PA模块报错-实际返回的行数超出请求的行数(分析标准FORM报错解决思路)

    录入预算报错时报错: 分析:这个错误是select into 语句返回多行的结果,但具体在哪? 两种方法查找,trace 或者debug 1.trace 启用调试 获取trace文件 -bash-3. ...

  6. H5学习之旅-H5的超链接以及图片链接(6)

    链接内容 1.文本链接 2.图片链接 属性 href:指向另一个文档的链接 name:文档内部的链接 img标签属性 alt:替换文本属性 width:宽 height:高 代码实例 <!DOC ...

  7. mysql进阶(二十一)删除表数据

    MySQL删除表数据 在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句.DELETE语句可以通过WHERE对要删除的记录进行选择.而使用TRUNC ...

  8. Cocos2D绘制纹理的一般方法

    如果你想在通常情况下绘制纹理,最简单的方法是在CCSprite的子类中实现.否则你将不得不自己创建一个CCRenderState对象传递给blend模式,着色器以及(可选的)纹理给CCRenderer ...

  9. iOS中关于UIApplication的详细介绍

    UIApplication 什么是UIApplication? UIApplication对象是应用程序的象征.每一个应用都有自己的UIApplication对象,这个对象是系统自动帮我们创建的, 它 ...

  10. sql将查询结果建立为新表

    1.sqlserver中,使用: select * into tab_new from tab_old SELECT * into anzhiresult from (select * from fa ...