装饰器之我见

  python里的装饰器到底是个什么东东,初看起来,可能有的小伙伴会发懵啊,哈哈。

  先来个装饰器的例子瞅瞅:

   

  Author:RYB
# __*__coding:utf-8__*__ '''
dec函数通过用户名和密码实现验证功能。
'''
def dec(func):
def auth():
username = "ryb"
password = ""
user = input("username:").strip()
passwd = input("password:").strip()
if user == username and passwd == password:
msg = print("验证通过,欢迎来到京东商城!")
elif user == username and passwd != password:
msg = print("密码不正确,请输入正确的密码!")
elif user != username and passwd != password:
msg = print("用户名和密码均不正确,请输入正确的用户名和密码!")
else:
msg = print("用户名不正确,请输入正确的用户名!")
return auth #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
@dec
def jd():
print("welcome to jd!") #执行jd函数
jd()

 上面装饰器例子(函数版):可读性更强一些哈哈

    

 # Author:RYB
# __*__coding:utf-8__*__ #用户名和密码都正确
def user_passd_right():
msg = print("验证通过,欢迎来到京东商城!") #用户名正确,密码不正确
def useright_passd():
print("密码不正确,请输入正确的密码!") #用户不正确,密码正确
def user_passdright():
print("用户名不正确,请输入正确的用户名!") #用户名和密码都不正确
def user_passd():
print("用户名和密码均不正确,请输入正确的用户名和密码!") '''
dec函数通过用户名和密码实现验证功能。
'''
def dec(func):
def auth():
username = "ryb"
password = ""
user = input("username:").strip()
passwd = input("password:").strip()
if user == username and passwd == password:
user_passd_right()
func()
elif user == username and passwd != password:
useright_passd()
elif user != username and passwd != password:
user_passd()
else:
user_passdright()
return auth #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
@dec
def jd():
print("welcome to jd!") #执行jd函数
jd()

    

那么到底装饰器是个什么东西呢?我想,通过上面的例子说的通俗一些,伙伴们多少知道一些吧。装饰器其实也是一个函数,一个用来包装函数的函数,装饰即修饰,意指为其他函数添加新功能。

  装饰器定义:本质就是函数,功能是为其他函数添加新功能

  装饰器需要遵循的原则:

    1.不修改被装饰函数的源代码(开放封闭原则);

    2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式。

  装饰器知识储备:装饰器=高阶函数+函数嵌套+闭包

  装饰器的例子1:

    

 # Author:RYB
# __*__coding:utf-8__*__
import time def timer(func):
def wrapper():
start_time = time.time()
func()
stop_time = time.time()
print('run time is %s' %(stop_time-start_time))
return wrapper
#@timer等价index=timer(index)
@timer
def index():
print("in the index")
index()

运行结果如下:  

  in the index
  run time is 0.0

  装饰器的例子2:有参数的

    

 # Author:RYB
# __*__coding:utf-8__*__ import time
def timer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper #@timer等价index=timer(index)
@timer
def index(msg):
print("in the index:",msg)
return 1
res=index("hello myworld")
print(res)

运行结果:  

  in the index: hello myworld
  run time is 0.0
  1

python自动化开发-4的更多相关文章

  1. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  2. python自动化开发学习 I/O多路复用

    python自动化开发学习 I/O多路复用   一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...

  3. Python自动化开发-简介

    1.Python简介 Python创始人  Guido Van Rossum,人称"龟叔",1989年圣诞节期间,为了在阿姆斯特丹打发时间,开发的一个新的脚本解释程序 作为ABC语 ...

  4. python自动化开发-1

    1.python简介 python是一门简明并且强大的面向对象的开发语言,已经在WEB开发,软件开发,科学计算,大数据分析,自动化运维等领域得到了广泛的应用. 注意:所有测试均已python3为主,与 ...

  5. 写给深圳首期Python自动化开发周未班的信

    你是否做了正确的决定? 深圳首期周未班的同学们大家好,我是Alex, 老男孩教育的联合创始人,Python项目的发起人,51CTO学院连续2届最受学员喜爱的讲师,中国最早一批使用Python的程序员, ...

  6. python自动化开发-2

    1.python的数据类型之列表 列表是Python开发语言中最常见的数据类型之一,通过列表可以实现对数据的增删改等常用操作. 列表的定义:例子 names = ["Lucy",& ...

  7. python自动化开发-[第二十一天]-form验证,中间件,缓存,信号,admin后台

    今日概要: 1.form表单进阶 2.中间件 3.缓存 4.信号 5.admin后台 上节课回顾 FBV,CBV 序列化 - Django内置 - json.dumps(xxx,cls=) Form验 ...

  8. python自动化开发-[第十六天]-bootstrap和django

    今日概要: 1.bootstrap使用 2.栅格系统 3.orm简介 4.路由系统 5.mvc和mtv模式 6.django框架 1.bootstrap的引用方式 1.Bootstrap 专门构建了免 ...

  9. python自动化开发-[第十一天]-Mysql

    今日概要: 1.初识mysql 2.MySQL的增删改查 3.主键.外键 4.组合和分组 一.数据库的由来 1.什么是数据库? 数据的仓库,在ATM,购物车中存储数据为目录,称为数据库 1.数据以表格 ...

  10. python自动化开发-[第十天]-线程、协程、socketserver

    今日概要 1.线程 2.协程 3.socketserver 4.基于udp的socket(见第八节) 一.线程 1.threading模块 第一种方法:实例化 import threading imp ...

随机推荐

  1. HYSBZ2565最长双回文串 Manacher

    顺序和逆序读起来完全一样的串叫做回文串.比如 acbca 是回文串,而 abc 不是( abc 的顺序为 “abc” ,逆序为 “cba” ,不相同). 输入长度为 n 的串 S ,求 S 的最长双回 ...

  2. Android 使用View绘制文字(DrawText)技术总结

    转载请注明出处: http://www.cnblogs.com/renhui/p/7453534.html 这里的绘制文字不是直接调用TextView.setText(String content)去 ...

  3. 标签页(tab)切换的原生js,jquery和bootstrap实现

    概述 这是我在学习课程Tab选项卡切换效果时做的总结和练手. 原课程中只有原生js实现,jquery和bootstrap实现是我自己补上的. 本节内容 标签页(tab)切换的原生js实现 标签页(ta ...

  4. 从 moment -> nodejs -> sequelize -> postgres,你都得设置好时区

    背景 最近在做报表统计,因为 sequelize 的时区配置没加导致了统计数字对不上的问题. 问:大家都知道时区,但是你清楚 UTC 和 GMT 的区别吗? 答:UTC 是我们现在用的时间标准,GMT ...

  5. 1.Django自学课堂

    1.django manage.py startproject project_name   -->创建工程 2.python manage.py startapp app_name   --& ...

  6. 如何把checkbox做成radio一样的单选效果

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>复 ...

  7. Python必会的单元测试框架 —— unittest

    用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库——unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那 ...

  8. php网页上传文件到Ubuntu服务器(input type=fire)- 赖大大

    直接上代码: <form enctype="multipart/form-data" method="post" action=""& ...

  9. Node.js开发框架Express4.x

    从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏 ...

  10. 使用Java代码自定义Ribbon配置

    很多场景下,需要实现不同的微服务采用不同的策略,例如修改Ribbon的负载均衡规则等.Spring Cloud允许使用Java代码自定义Ribbon的配置. 在Spring Cloud中,Ribbon ...