装饰器

1. 开放封闭原则

扩展是开放的,增加新的功能;修改源码(修改已经实现的功能)是封闭的。
在不改变源码及调用方式的前提下额外增加新的功能。
# 版一:
import time
start_time = time.time() #起始时间
def func():
time.sleep(2) #睡眠,模拟网络延迟
print("我要飞")
func()
print(time.time()- start_time) # 打印执行世界 # 版二:
import time
def times(s):
start_time = time.time()
s()
print(time.time()- start_time)
def foo():
time.sleep(2)
print("我要飞")
times(foo) #改变了调用方式 # 版三(初版装饰器):
import time
def times(s):
def inner():
start_time = time.time()
s()
print(time.time()- start_time)
return inner
def func():
time.sleep(1)
print("我也要飞")
func = times(func) # 不需改调用方式
func() # 版四(升级):
def wrapper(f):
def inner(a): #加入参数
f(a)
return inner # 切记不加括号 def func(a): # 加参数
print(f"这是{a}的函数")
func = wrapper(func)
func("alex") # 升级 万能传参:
import time
def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
f(*args,**kwargs)
print(time.time() - start_time)
return inner # 切记不加括号 def func(*args,**kwargs): # 加形参
time.sleep(1)
print(f"这是{args,kwargs}的函数")
func = wrapper(func)
func("alex",1,2,a = 3,b = 4) def foo(*args,**kwargs): # 加形参
time.sleep(2)
print(f"这是{args,kwargs}的函数")
foo = wrapper(foo)
foo("meet",1,2,a = 3,b = 4) #语法糖 放在被装饰函数的上方
#替代func = wrapper(func) 和 foo = wrapper(foo) import time
def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
f(*args,**kwargs)
print(time.time() - start_time)
return inner # 不加括号
@wrapper #语法糖
def func(*args,**kwargs): # 加形参
time.sleep(1)
print(f"这是{args,kwargs}的函数")
# func = wrapper(func)
@wrapper #语法糖
def foo(*args,**kwargs): # 加形参
time.sleep(2)
print(f"这是{args,kwargs}的函数")
# foo = wrapper(foo) func("alex",1,2,a = 3,b = 4)
foo("meet",5,6,a = 7,b = 8) # 标准版:
import time
def wrapper(f):
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
print(time.time() - start_time)
return ret #增加返回值
return inner # 切记不加括号
@wrapper #语法糖
def func(*args,**kwargs): # 加形参
time.sleep(1)
print(f"这是{args,kwargs}的函数")
return "这是alex的返回"
print(func("alex",1,2,a = 3,b = 4)) # 会打印"这是alex的返回"
#语法糖  放在被装饰函数的上方

#标准版的装饰器:
def wrapper(func):
def inner(*args,**kwargs):
'''执行被装饰函数之前的操作'''
ret = func(*args,**kwargs)
'''执行被装饰函数之后的操作'''
return ret # 返回inner(),也就是func()打印
return inner
@wrapper # 相当于 func = wrapper(func)
def func(*args,**kwargs)
print(args,kwargs)
return "返回的内容" # 返回ret
print(func()) # 能够打印返回值,也可以传参

python 14 装饰器的更多相关文章

  1. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  2. Python的装饰器实例用法小结

    这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...

  3. Python各式装饰器

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...

  4. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  5. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  6. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  7. 两个实用的Python的装饰器

    两个实用的Python的装饰器 超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码 ...

  8. python 基础——装饰器

    python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...

  9. python基础—装饰器

    python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...

随机推荐

  1. DAX 第六篇:统计函数

    统计函数用于创建聚合,对数据进行统计分析.在使用统计函数时,必须考虑到数据模型,表之间关系,数据重复等因素,一般都会搭配过滤函数实现数据的提取和分析. 统计量一般是:均值.求和.计数.最大值.最小值. ...

  2. C#编程之自动实现的属性

    在 C# 3.0 及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁.它们还允许客户端代码创建对象.当你声明以下示例中所示的属性时,编译器将创建仅可以通过该属性的 ge ...

  3. MySQL8.0 zip压缩包版本 Windows下安装

    MySQL zip压缩包版本 Windows下安装 Download MySQL Community Server 解压到相应的目录 我的解压目录:D:\Program Files\mysql-8.0 ...

  4. Jibx 只绑定需要的字段

    栗子:     binding.xml   <?xml version="1.0" encoding="UTF-8"?> <binding&g ...

  5. tomcat常见面试题目问答Top10

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,它 ...

  6. 【Android】System.exit(0) 退出程序

    许多 Android 应用程序都是连续点击两下返回键时退出程序,代码如下: private long exitTime = 0; @Override public boolean onKeyDown( ...

  7. Lexical or preprocessor 'XXX/XXX.h' issue file not found

    最近做第三方登录,引入了第三库,结果就出来个这个问题.如下图所示: 刚开始编译运行都没问题,可下次再打开时就报这个错误…… 一个比较弱智的解决办法: 1. 删除第三方库文件(删除到垃圾箱,而且还要在文 ...

  8. 计算机网络中IP地址和MAC地址

    计算机 网络中的网络地址有I P 地址和物理地址之分,对 于主机间的通信时,它们的作用也不一样 . l   I P 地址 为 了保证 I n t e r n e t 网上主机通信时能够相互识别 ,不引 ...

  9. c#小灶——输出语句

    前面我我们学习了如何在控制台输出一句话,今天我们学习一下更详细的输出方式. Console.WriteLine();和Console.Write(); 我们来看一下下面几行代码, using Syst ...

  10. DesignPattern系列__03依赖倒置原则

    依赖倒置原则(Dependence Inversion Priiciple,DIP) 介绍 High level modules should not depend upon low level mo ...