然后给大家介绍的是Wrapper(装饰器),使用广泛。python笔试,面试的话也会百分百问到的,基础和中级的知识储备还是必用的。

让我们开始。

先来一些基础相关知识

*args,**kwargs的区别

def function(x,y,*args,**kwargs):
print(type(x))
print(args)
print(kwargs)
print(type(args))
print(type(kwargs)) function(1,2,3,4,5,a=1,b=2,c=3) <type 'int'>
(3, 4, 5)     #*args返回的是数组
{'a': 1, 'c': 3, 'b': 2} #**kwargs返回的字典
<type 'tuple'>
<type 'dict'>

正题开始

固定模板

装饰器:wrapper
模板:
def 装饰器名(func): #def 与 @之后的函数名称一致 调用函数func与ret=func(*args,**kwargs)内部函数一致
def wrapper(*args,**kwargs): #def 与 return 之后的函数名称一致
ret = func(*args,**kwargs)
return ret #return ret 与 ret=func(*args,**kwargs)一致
return wrapper @装饰器名
def foo():
pass
import time

def timmer(fun1):
def wrapper(*args,**kwargs):
start_time=time.time()
res=fun1(*args,**kwargs)
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper @timmer
def foo():
time.sleep(3)
print('from foo') @timmer
def foo1():
time.sleep(5)
print('from foo1') foo()
foo1()

@wraps:避免被装饰函数自身的信息丢失

未添加@wraps

#-*- coding:utf-8 -*-
def decorator(func):
def inner_function():
pass
return inner_function @decorator
def func():
pass print(func.__name__)
#inner_function

添加@wraps

from functools import wraps

def decorator(func):
@wraps(func)
def inner_function():
pass
return inner_function @decorator
def func():
pass print(func.__name__)
#func
#@wraps:避免被装饰函数自身的信息丢失

多个装饰器的同时使用

def makebold(f):
return lambda:'<b>'+f()+'</b>'
def makeitalic(f):
return lambda:'<i>'+f()+'</i>'
def makeitalic1(f):
return lambda:'<strong>'+f()+'</strong>' @makebold
@makeitalic1
@makeitalic
def say():
return 'hello' print(say())
#<b><strong><i>hello</i></strong></b>
#多个装饰器的执行顺序:是从近到远依次执行。

类装饰器

#类装饰器
class Decorator(object):
def __init__(self, f):
self.f = f
def __call__(self):
print("decorator start")
self.f()
print("decorator end") @Decorator
def func():
print("func") func()
'''
decorator start
func
decorator end
'''
import time

def decorator(func):
def wrapper(*args,**kwargs):
start_time = time.time()
func(*args,**kwargs)
end_time = time.time()
print(end_time - start_time)
return wrapper class Method(object): @decorator
def func(self):
time.sleep(0.8) p1 = Method()
p1.func() # 函数调用
'''
0.815999984741
对于类方法来说,都会有一个默认的参数self,它实际表示的是类的一个实例,所以在装饰器的内部函数wrapper也要传入一个参数
- me_instance(任意参数)就表示将类的实例p1传给wrapper,其他的用法都和函数装饰器相同。
'''

较为复杂的多个装饰器

import time

def deco01(func):
def wrapper(*args, **kwargs):
print("this is deco01")
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
print("deco01 end here")
return wrapper def deco02(func):
def wrapper(*args, **kwargs):
print("this is deco02")
func(*args, **kwargs)
print("deco02 end here")
return wrapper @deco01
@deco02
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b)) if __name__ == '__main__':
f = func
f(3,4) '''
this is deco01
this is deco02
hello,here is a func for add :
result is 7
deco02 end here
time is 1032 ms
deco01 end here
'''
#多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。

python--Wrapper的更多相关文章

  1. android 自动化测试 ---python wrapper(python 包装)

    关于有道云笔记复制的东西不能直接copy到博客园,可以选择使用txt文件做个媒介 1.appium 2.monkeyrunner 3.uiautomator2 前面两种种方式都要加载androidsd ...

  2. Python框架、库以及软件资源汇总

    转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...

  3. Awesome Python

    Awesome Python  A curated list of awesome Python frameworks, libraries, software and resources. Insp ...

  4. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  5. Building Python 2.7.10 with Visual Studio 2010 or 2015 - Google Chrome

    您的浏览器(Chrome 33) 需要更新.该浏览器有诸多安全漏洞,无法显示本网站的所有功能. 了解如何更新浏览器 × p-nand-q.com C++  Python  Programming  L ...

  6. python提取隐含结构的字符串

    当我用Stanford CoreNLP和A Python wrapper for the Java Stanford Core NLP tools(NLP的python调用工具)进行句法分析时,遇到一 ...

  7. Python:渗透测试开源项目

    Python:渗透测试开源项目[源码值得精读] sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工 ...

  8. Python金融行业必备工具

    有些国外的平台.社区.博客如果连接无法打开,那说明可能需要"科学"上网 量化交易平台 国内在线量化平台: BigQuant - 你的人工智能量化平台 - 可以无门槛地使用机器学习. ...

  9. python 各种开源库

    测试开发 来源:https://www.jianshu.com/p/ea6f7fb69501 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. 链接 sel ...

  10. python 三方面库整理

    测试开发 Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. –推荐 mechanize- Python中有状 ...

随机推荐

  1. C# 十进制与二进制、十六进制、八进制之间的转换

    1.十进制 转 二进制 将十进制数不断地除2,将所有余数倒叙填写,即可得到所需二进制数据. public static string DecimalToBinary(int vDecimal) { / ...

  2. js跳转到邮箱登录

    做邮箱验证时为了用户体验,往往会有跳转到邮箱登录这一按钮,其中的js如下: $("#btnemail").click(function () { var userEmail = $ ...

  3. td标签里内容不换行

    在一些页面开发中,除自己操作外,引起换行的情况一般有: Ex一.td标签里内容长度过长引起换行: Ex二.div标签(或其他标记)里内容有文本和图片引起换行: 解决方法: 针对例子一用<nobr ...

  4. jQuery综述

    jQuery是一个轻量级JavaScript库 它可以进行如下操作: 选取HTML元素 对HTML元素进行操作 对CSS进行操作 编写HTML事件函数 JavaScript特效 HTML DOM AJ ...

  5. UrShop 商城系统介绍

    UrShop能够帮助企业快速构建个性.高效.稳定.安全的网上商城并减少二次开发带来的成本.对于网店来说,UrShop除了安装便捷,功能上强大以外,操作上也非常方便快捷.优社电商秉承设身处地为客户着想的 ...

  6. F12 chrome开发者工具

    1.Network详解篇 : https://blog.csdn.net/qq_39208536/article/details/79304148 2.sources: js调试篇  http://b ...

  7. Gradle 教程:第二部分,JAVA PROJECTS【翻译】

    原文地址:http://rominirani.com/2014/07/28/gradle-tutorial-part-2-java-projects/ 在这部分的教学中,我们会学习如何使用Gradle ...

  8. Ubuntu 16.10 安装mysql

    打开终端 sudo apt update 完成后 sudo apt install mysql-server 中间会提示设置root 账户的密码 有的文章提到 还要 install mysql-cli ...

  9. Chromium源码系列一:Chromium简介及源代码获取和编译

    Chromium源码系列一:Chromium简介及源代码获取和编译 Chromium简介 ​ Chromium是一个由Google主导开发的网页浏览器,以BSD许可证等多重自由版权发行并开放源代码.C ...

  10. System Center Configuration Manager 2016 必要条件准备篇(Part2)

    步骤2.下载并安装Windows ADK.WDS组件 注意:在Configuration Manager服务器(CM16)上以本地管理员身份执行以下操作 当我们使用Configuration Man ...