python自动化开发-4
装饰器之我见
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的更多相关文章
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- python自动化开发学习 I/O多路复用
python自动化开发学习 I/O多路复用 一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...
- Python自动化开发-简介
1.Python简介 Python创始人 Guido Van Rossum,人称"龟叔",1989年圣诞节期间,为了在阿姆斯特丹打发时间,开发的一个新的脚本解释程序 作为ABC语 ...
- python自动化开发-1
1.python简介 python是一门简明并且强大的面向对象的开发语言,已经在WEB开发,软件开发,科学计算,大数据分析,自动化运维等领域得到了广泛的应用. 注意:所有测试均已python3为主,与 ...
- 写给深圳首期Python自动化开发周未班的信
你是否做了正确的决定? 深圳首期周未班的同学们大家好,我是Alex, 老男孩教育的联合创始人,Python项目的发起人,51CTO学院连续2届最受学员喜爱的讲师,中国最早一批使用Python的程序员, ...
- python自动化开发-2
1.python的数据类型之列表 列表是Python开发语言中最常见的数据类型之一,通过列表可以实现对数据的增删改等常用操作. 列表的定义:例子 names = ["Lucy",& ...
- python自动化开发-[第二十一天]-form验证,中间件,缓存,信号,admin后台
今日概要: 1.form表单进阶 2.中间件 3.缓存 4.信号 5.admin后台 上节课回顾 FBV,CBV 序列化 - Django内置 - json.dumps(xxx,cls=) Form验 ...
- python自动化开发-[第十六天]-bootstrap和django
今日概要: 1.bootstrap使用 2.栅格系统 3.orm简介 4.路由系统 5.mvc和mtv模式 6.django框架 1.bootstrap的引用方式 1.Bootstrap 专门构建了免 ...
- python自动化开发-[第十一天]-Mysql
今日概要: 1.初识mysql 2.MySQL的增删改查 3.主键.外键 4.组合和分组 一.数据库的由来 1.什么是数据库? 数据的仓库,在ATM,购物车中存储数据为目录,称为数据库 1.数据以表格 ...
- python自动化开发-[第十天]-线程、协程、socketserver
今日概要 1.线程 2.协程 3.socketserver 4.基于udp的socket(见第八节) 一.线程 1.threading模块 第一种方法:实例化 import threading imp ...
随机推荐
- InnoDB体系架构(一)后台线程
InnoDB体系架构——后台线程 上一篇已经了解了MySQL数据库的体系结构 这一篇除了介绍InnoDB存储引擎的体系架构外,同时进一步了解InnoDB的后台线程. InnoDB存储引擎是多线程的模型 ...
- 为什么 echo 3 . print(2) . print(4) . 5 . 'c'的结果是45c2131
例子:请写出echo 3 . print(2) . print(4) . 5 . 'c'的输出结果为____? 许多人看到这个题的第一印象是输出结果不就是3245c嘛,然而正确的是答案却是45c213 ...
- 《http权威指南》读书笔记1
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- 【译】使用 ndb 调试 node 应用
原文链接:Debugging Node.js Application Using ndb Google Chrome 实验室发布了一款新的 node debug 工具来提升开发者体验,本文将会全面介绍 ...
- web自动化测试(java)---元素定位
和python类似,java-selenium也提供了很多种元素定位的方法,具体如下: findElement(By.id()) findElement(By.name()) findElement( ...
- app自动化测试之实战应用(百度app简单测试)
模拟在百度app中搜索python相关内容代码如下: from appium import webdriver desired_caps = {} desired_caps['deviceName'] ...
- 如何把checkbox做成radio一样的单选效果
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>复 ...
- SQL Server性能优化(15)选择合适的索引
一.关于聚集索引列的选择(参考) 1. 聚集索引所在的列,或者列的组合最好是唯一的. 当我们创建的聚集索引的值不唯一时,SQL Server则无法仅仅通过聚集索引列(也就是关键字)唯一确定一行.此时, ...
- PHP-CPP开发扩展(五)
PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解如何在C++中实现PHP类. 类和对象 类和对象 怎样在PHP-CPP里写出PHP的类呢?很简单,看下面的例子: main.cpp /** * ...
- WC2017游记 & 能力残废康复计划
懒癌晚期的蒟蒻一年多没有更Blog了… 这次冬眠营去绍一省好好地游玩了一番,体验了一段时间的豪华自助餐,成功吃胖… 第一课堂的东西基本还是没吸收…听着觉得有点道理,结果过几分钟就忘了…可能最大的收获就 ...