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 ...
随机推荐
- Linux pwn入门教程(1)——栈溢出基础
作者:Tangerine@SAINTSEC 原文来自:https://bbs.ichunqiu.com/thread-42241-1-1.html 0×00 函数的进入与返回 要想理解栈溢出,首先必须 ...
- go连接mysql
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysq ...
- 谈谈我们对userAgent的看法,为什么爬虫中需要userAgent?
首先打开浏览器,按 F12 进入控制台(Console),然后输入:navigator.userAgent,即可看到 UA.例如: 1 2 Mozilla/5.0 (Windows NT 10.0; ...
- OpenGL ES: iOS 自定义 UIView 响应屏幕旋转
iOS下使用OpenGL 如果使用GLKit View 那么不用担心屏幕旋转的问题,说明如下: If you change the size, scale factor, or drawable pr ...
- mongodb远程备份
创建备份用户 db.createUser({user: 'backup',pwd: 'back123' ,roles : [{role : 'userAdminAnyDatabase' ,db : ' ...
- IDEA内置git功能的使用教程
IDEA内置git功能的使用教程 IDEA git IDEA被公认为是最好的java开发工具,除了在代码助手.代码提示.重构工具等方面有比较好的支持,还在各类版本控制工具(git.tfs.svn.g ...
- ThinkNet终于见面了
经过一段时间的DDD学习,第一个开源框架终于初步完成了,我为他命名为ThinkNet.之前或许你听过ThinkPHP,没错,虽然我对php没有过多的掌握,但是借助thinkphp,我也能开发一个web ...
- iOS事件拦截及应用
1.概述 我们知道事件的分发是由Application到Window再到各级View的,所以显然最安全可靠的拦截地方是Application.这里拦截事件后如果不手动往下分发,则进入hit-test ...
- 全网最详细的一个超级好用的命令行工具【Cmder】是什么?
不多说,直接上干货! Cmder是什么? 一款Windows环境下非常简洁美观易用的cmd替代者,它支持了大部分的Linux命令.支持ssh连接linux,使用起来非常方便.比起cmd.powersh ...
- Docker修改默认网段
因阿里云服务器VPC默认占用了172.16.0.0/16 网段,与Docker里的网段相同,导致Docker里无法连接VPC服务器.后来找到的解决方案是修改Docker的默认网段. 由于Docker默 ...