装饰器:

#模板
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. iOS中 本地通知/本地通知详解 韩俊强的博客

    布局如下:(重点讲本地通知) iOS开发者交流QQ群: 446310206 每日更新关注:http://weibo.com/hanjunqiang  新浪微博 Notification是智能手机应用编 ...

  2. A*寻路算法入门(七)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  3. Android开发技巧——使用PopupWindow实现弹出菜单

    在本文当中,我将会与大家分享一个封装了PopupWindow实现弹出菜单的类,并说明它的实现与使用. 因对界面的需求,android原生的弹出菜单已不能满足我们的需求,自定义菜单成了我们的唯一选择,在 ...

  4. Android官方网站

     http://wear.techbrood.com/sdk/installing/index.html?pkg=tools

  5. Binder和SurfaceFlinger以及SystemServer介绍-android学习之旅(79)

    由于binder机制的存在,使得进程A可以访问进程B中的对象. Android系统Binder机制中的四个组件Client.Server.Service Manager和Binder驱动程序: 1. ...

  6. JavaScript进阶(十一)JsJava2.0版本

    JavaScript进阶(十一)JsJava2.0版本 2007年9月11日,JsJava团队发布了JsJava2.0版本,该版本不仅增加了许多新的类库,而且参照J2SE1.4,大量使用了类的继承和实 ...

  7. java工具类(一)之服务端java实现根据地址从百度API获取经纬度

    服务端java实现根据地址从百度API获取经纬度 代码: package com.pb.baiduapi; import java.io.BufferedReader; import java.io. ...

  8. Android开源项目——带图标文字的底部导航栏IconTabPageIndicator

    接下来的博客计划是,在<Android官方技术文档翻译>之间会发一些Android开源项目的介绍,直接剩下的几篇Android技术文档发完,然后就是Android开源项目和Gradle翻译 ...

  9. Eclipse 项目以非gradle方式导入Android Studio

    对于以前习惯了Eclipse ide的开发这来说,要把项目导入到studio是一件很不愿接受的事情,但是...毕竟人家官方都给出建议了,并且年后会逐渐被淘汰 如下图所示是一个典型的eclipse项目. ...

  10. 解决unbuntu14.04上的eclipse自动退出的问题

    新安装的ubuntu14.04版,把以前12.04上正常使用的eclipse拷贝到14.04上后,启动eclipse后,输入代码时出现点"."提示符就会自动重启. jdk是1.7. ...