day010|python之装饰器
装饰器02
1 装饰器的语法糖
1.1 定义
为了简洁而优雅地使用装饰器,Python提供了专门的装饰器语法来取代index=timer(index)的形式,需要在被装饰对象的正上方单独一行添加@timer,当解释器解释到@timer时就会调用timer函数,且把它正下方的函数名当做实参传入,然后将返回的结果重新赋值给原函数名
1.2 基本使用
import time
def timmer(f):
def wrapper(*args, **kwargs):
start = time.time()
res = f(*args, **kwargs)
stop = time.time()
print('run time is %s' % (stop - start))
return res
return wrapper
@timmer # index = timmer(index)
def index():
time.sleep(1)
print('from index')
@timmer # home = time(home)
def home(name):
time.sleep(2)
print('welcome to %s' % name)
return 123
index()
res = home("ccc")
print(res)
# from index
# run time is 1.0003390312194824
# welcome to ccc
# run time is 2.0008108615875244
# 123
2 有参装饰器
2.1 基本用法
@auth(driver='file')
def index():
pass
@auth(driver='mysql')
def home():
pass
2.2 示例
import time
def login(x, engine='file'):
def auth(func):
def wrapper(*args, **kwargs):
print("========>", x)
inp_user = input("username>>>>:").strip()
inp_pwd = input("password>>>:").strip()
if engine == "file":
print("基于file认证")
if inp_user == "egon" and inp_pwd == "123":
print('login successful')
res = func(*args, **kwargs)
return res
else:
print('username or password error')
elif engine == 'mysql':
print("基于mysql认证")
elif engine == "ldap":
print("基于ldap认证")
else:
print("未知认证来源")
return wrapper
return auth
@login(11, engine='file') # @auth # index = auth(index) # index=wrapper
def index():
time.sleep(1)
print('from index')
@login(22, engine='file') # @auth # home=auth(home) # home=wrapper
def home(name):
time.sleep(2)
print('home page,welcome %s' % name)
return 123
index()
home('egon')
# ========> 11
# username>>>>:egon
# password>>>:123
# 基于file认证
# login successful
# from index
# ========> 22
# username>>>>:egon
# password>>>:123
# 基于file认证
# login successful
# home page,welcome egon
3叠加多个装饰器
3.1 基本用法
@deco3
@deco2
@deco1
def index():
pass
# 本质
index=deco3(deco2(deco1(index)))
3.2 示例
def outter1(func1): # func1 = wrapper2的内存地址
print('============>outter1')
def wrapper1(*args, **kwargs):
print('=============wrapper1')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outter2(func2): # func2 = wrapper3的内存地址
print('============>outter2')
def wrapper2(*args, **kwargs):
print('=============wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outter3(func3): # func3 = index的内存地址
print('============>outter3')
def wrapper3(*args, **kwargs):
print('=============wrapper3')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
# index = wrapper1的内存地址
@outter1 # outter1(wrapper2的内存地址)-->wrapper1的内存地址
@outter2 # outter2(wrapper3的内存地址)-->wrapper2的内存地址
@outter3 # outter3(index的内存地址)-->wrapper3的内存地址
def index():
print('from index')
print('*'*25)
# print(index)
index()
# ============>outter3
# ============>outter2
# ============>outter1
# *************************
# =============wrapper1
# =============wrapper2
# =============wrapper3
# from index
import time
def timmer(func):
def wrapper1(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print('run time is:%s' % (stop - start))
return res
return wrapper1
def login(x, engine='file'):
def auth(func):
def wrapper2(*args, **kwargs):
print("========>", x)
inp_user = input("username>>>>:").strip()
inp_pwd = input("password>>>:").strip()
if engine == "file":
print("基于file认证")
if inp_user == "egon" and inp_pwd == "123":
print('login successful')
res = func(*args, **kwargs)
return res
else:
print('username or password error')
elif engine == 'mysql':
print("基于mysql认证")
elif engine == "ldap":
print("基于ldap认证")
else:
print("未知认证来源")
return wrapper2
return auth
# 场景一
@timmer
@login(11, engine='file')
def index():
time.sleep(1)
print('from index')
index()
# ========> 11
# username>>>>:egon
# password>>>:123
# 基于file认证
# login successful
# from index
# run time is:9.147817134857178
# 场景二
@login(11, engine='file')
@timmer
def index():
time.sleep(1)
print('from index')
index()
# ========> 11
# username>>>>:egon
# password>>>:123
# 基于file认证
# login successful
# from index
# run time is:1.0001623630523682
4 wraps装饰器
4.1 定义
- functools模块下提供一个装饰器wraps专门用来帮我们保留原函数的文档和函数名属性,修正装饰器
4.2 示例
import time
from functools import wraps
def timmer(func):
@wraps(func)
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
@ timmer
def index():
"""index函数"""
time.sleep(1)
print('from index')
help(index)
5 匿名函数
"""
def func(x, y): # func=函数的内存地址
return x+y
匿名函数:没有名字的函数
应用场景:临时用一次,通常用于与其他函数配合使用
"""
# 无用调用方式
f = lambda x, y: x+y
print(f)
res = f(1, 2)
print(res)
# 调用方式1
res = (lambda x, y: x+y)(1, 2)
print(res)
# 调用方式2
salaries = {
"egon": 1000,
"alex": 2000,
"jack": 3000,
"rose": 4000
}
# 求薪资最高的那个人的名字
def get_salary(name):
return salaries[name]
print(max(salaries, key = get_salary)) # rose
print(max(salaries, key=lambda name: salaries[name])) # rose
print(min(salaries, key=lambda name: salaries[name])) # egon
print(sorted(salaries)) # ['alex', 'egon', 'jack', 'rose']
print(sorted(salaries, key=lambda name: salaries[name])) # ['egon', 'alex', 'jack', 'rose']
print(sorted(salaries, key=lambda name: salaries[name], reverse=True)) # ['rose', 'jack', 'alex', 'egon']
# 返回绝对值
print(abs(-11)) # 11
print(abs(0)) # 0
print(abs(11)) # 11
# 如果是空或布尔值为真则返回True
print(all('')) # True
print(all([])) # True
print(all([11, 22, 333, 0])) # False
# 只要有一个值的布尔值为真就返回True
print(any('')) # False
print(any([])) # False
print(any([0, None, '', 1])) # True
print(any([0, None, ''])) # False
# ASCⅡ表:65-90 A-Z
print(chr(65)) # 数字->字母A
print(ord('A')) # 字母->数字65
print(chr(90)) # Z
# 进制转换
print(bin(11)) # 十进制->二进制 0b1011
print(oct(11)) # 十进制->八进制 0o13
print(hex(11)) # 十进制->十六进制 0xb
# 工厂函数
int
float
str
list
tuple
dict
set
bool
bytes
# 查看对象是否可调用
print(callable(len)) # True
# 面向对象重点
classmethod
staticmethod
setattr
getattr
delattr
hasattr
dir
exec
l = eval("[1, 2, 3]")
print(l[0]) # 1
with open('user1.txt', mode='wt', encoding='utf-8') as f:
dic = {"ccc": "123", "zzz": "456", "yyy": "789"}
f.write(str(dic))
with open('user1.txt', mode='rt', encoding='utf-8') as f:
data = f.read()
print(data, type(data)) # {'ccc': '123', 'zzz': '456', 'yyy': '789'} <class 'str'>
dic = eval(data)
print(dic["ccc"]) # 123
day010|python之装饰器的更多相关文章
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- 两个实用的Python的装饰器
两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- python基础—装饰器
python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...
- 详解Python的装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
随机推荐
- -bash: bash_profile: command not found问题
这个问题一般就是.bash_profile 文件内容错误,里面内容没加注释之内的,vi .bash_profile打开文件检查一下,然后:wq!保存退出 我的错误就是红圈处没有注释造成的
- IDEA安装leetcode editor插件
leetcode > https://leetcode-cn.com/ 本地idea刷题可以直接同步提交,测试等相关操作 需要安装leetcode editor插件 1.idea setting ...
- UI自动化中无头浏览器的应用
因为某次工作中写了个脚本要来回跑,还要在本机上做很多其他的事情,所以就上网找了个方法,无头浏览器,这样就不会浏览器来回弹出来,执行用例还会很快. 废话不多说,直接放代码: #coding=utf-8 ...
- java1.8安装及环境变量配置
一.前言 虽然jdk1.9版本已经问世,但是许多其他的配套设施并不一定支持jdk1.9版本,所以这里仅带领你配置jdk1.8.而jdk1.9的操作也几乎是相同的. 本教程适用于windows10 64 ...
- Python_自动化测试_项目
<论坛自动化测试项目> 1.自行选择合适的社区 2.功能要求 5个以上,不包含登录页 3.多手动测试 多用selenium IDE 4.生成测试报告,发送邮件 5.计划任务定时完成 6 ...
- Python_字符串处理方法
1.字符串转换 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sStr1 = 'strcpy2' print sStr2 1.字符串复制 #s ...
- Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念
世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 前序 最近想搞下基于Spring Cloud的认证授权平台,总体想法是可以对服务间授权,想做一个基于Agent 的无 ...
- 推荐系统实践 0x05 推荐数据集MovieLens及评测
推荐数据集MovieLens及评测 数据集简介 MoiveLens是GroupLens Research收集并发布的关于电影评分的数据集,规模也比较大,为了让我们的实验快速有效的进行,我们选取了发布于 ...
- 分布式监控系统之Zabbix 使用SNMP、JMX信道采集数据
前文我们了解了zabbix的被动.主动以及web监控相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14024212.html:今天我们来了解下zabb ...
- 聊聊 elasticsearch 之分词器配置 (IK+pinyin)
系统:windows 10 elasticsearch版本:5.6.9 es分词的选择 使用es是考虑服务的性能调优,通过读写分离的方式降低频繁访问数据库的压力,至于分词的选择考虑主要是根据目前比较流 ...