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 ...
随机推荐
- AndroidStudio制作个人资料界面模块以及SQLite数据库的使用
前言 大家好,给大家带来AndroidStudio制作个人资料界面模块以及SQLite数据库的使用的概述,希望你们喜欢 学习目标 掌握SQLite数据库的使用,能够实现用数据库来保存用户的信息: 学会 ...
- 你可能不知道的viewport
概述 前几天偶然看到一个pc端网页,发现用手机打开竟然同比缩放了,作为一个前端从业者,我自然想要弄清它到底是怎么缩放的.之后查了它的meta信息,css和js,发现没有任何兼容手机端的代码,那它到底是 ...
- 安装 composer 并启动 yii2 项目
环境 MacOS 10.12.6 PHP 5.6.30 yii2.0 一.composer (类似 node's npm) 1.安装 php -r "copy('https://getcom ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- .NET手记-为ASP.NET MVC程序集成Autofac
MVC Autofac总是会紧跟最新版本的ASP.NET MVC框架,所以文档也会一直保持更新.一般来讲,不同版本的框架集成Autofac的方法一般不变. MVC集成需要引用 Autofac.Mvc5 ...
- JavaScript中继承的那些事
引言 JS是一门面向对象的语言,但是在JS中没有引入类的概念,之前特别疑惑在JS中继承的机制到底是怎样的,一直学了JS的继承这块后才恍然大悟,遂记之. 假如现在有一个“人类”的构造函数: functi ...
- SQLi Lab的视频教程和文字教程
SQLi Lab 系列的文字和视频(需要FQ),讲解的很好 SQLi Lab Series - Introduction SQLi Lab Series - Error Based SQLi Lab ...
- abstract、virtual、sealed、 interface、struct 基础知识整理
abstract abstract 修饰符指示被修改内容的实现已丢失或不完整. abstract 修饰符可用于类.方法.属性.索引和事件. 在类声明中使用 abstract修饰符以指示某个类仅旨在作为 ...
- 【原创】贡献一个JS的弹出框代码...
一.前言 最近在做一个项目,自己感觉系统自带的alert()方法的弹出框实在是不堪入目,所以在网上找了一些资料,然后自己加工了一下,做出了自己的一个js弹出框,在这里贡献出来,希望对你有帮助. 二.开 ...
- SQL 必知必会·笔记<11>创建高级联结
1. 使用表别名 SQL 除了可以对列名和计算字段使用别名,还允许给表名起别名.这样 做有两个主要理由: 缩短SQL 语句: 允许在一条SELECT 语句中多次使用相同的表. 使用表别名示例: SEL ...