python中装饰器的原理以及实现,
python版本 3.6
1.python的装饰器说白了就是闭包函数的一种应用场景,在运用的时候我们遵循
#开放封闭原则:对修改封闭,对拓展开放
2.什么是装饰器
#装饰他人的器具,本身可以是任意可调用的对象,被装饰者也可以是任意可调用对象
#装饰器的原则:1.不可修改被装饰对象的源代码,2不修改被装饰对象的调用方式
#装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能
3.实现装饰器之前先来了解闭包函数
#1.闭包函数 => 函数嵌套+函数对象+名称空间与作用域
#闭:定义是在函数内的函数
#包:该内部函数需要访问一个名字,该名字是属于外层函数作用域的 #闭包函数实现的基本模板 def outter(xxx):
def inner()
xxx
return inner #为函数体传参的两个方案
#1.直接传入参数
#2.在函数体内部定义变量
4.装饰器的实现
#阶段一
#计算一个函数执行的时间 import time
def index():
time.sleep(1)
print("welcome to my world") start = time.time()
index()
end = time.time()
print("run time is %s" %(end - start))
#修改了装饰对象的源代码 #阶段二
import time
def index():
time.sleep(1)
print("welcome to my world") def wrapper():
start = time.time()
index()
end = time.time()
print("run time is %s" %(end - start))
#修改了装饰对象的调用方式 #阶段三
import time
def index():
time.sleep(1)
print("welcome to my world") def wrapper(func):
start = time.time()
func()
end = time.time()
print("run time is %s" %(end - start))
wrapper(index)
#修改了装饰对象的调用方式 #阶段四:
import time def index():
time.sleep(1)
print('welcome to index page') def timmer(func):
# func=最原始那个index的内存地址
def wrapper():
start=time.time()
func()
stop=time.time()
print('run time is %s' %(stop - start))
return wrapper
#把函数作为参数传进去,返回一个函数再去执行,替换返回的函数名为之前传入的函数
index=timmer(index) #index=wrapper的内存地址
index() #wrapper()
#这样就没有修改被装饰对象的源代码和调用方式
5.装饰器语法糖
#装饰器语法糖
#在被装饰器对象上方单独一行写:@装饰器的名称
解释器一旦执行到@装饰器的名字就会执行 原函数名 = 装饰器的名字(正下方的那个函数) #修订之后的装饰器
import time def timmer(func):
# func=最原始那个index的内存地址
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 #index=timmer(最原始那个index的内存地址) #index=wrapper的内存地址
def index():
time.sleep(1)
print('welcome to index page') index()
6.完善装饰器
#装饰器实现函数,其函数对象的变化,其中包括一些内置的方法__name__,__doc__等等,
#这些都是要在被装饰之后返回同样的name,doc
下面我们引入一个第三方包 去实现这些功能
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
# wrapper.__doc__=func.__doc__
# wrapper.__name__=func.__name__
return wrapper # @timmer #index=timmer(最原始那个index的内存地址) #index=wrapper的内存地址
def index():
"""
这是一个index函数
:return:
"""
time.sleep(1)
print('welcome to index page')
#上面的引入的第三方包wraps,调用其装饰器帮我们实现了
# wrapper.__doc__=func.__doc__
# wrapper.__name__=func.__name__ 等等这些功能,这样能更好的满足用户的需求
7.上面实现的装饰器是无参装饰器,有参装饰器更新中…………
python中装饰器的原理以及实现,的更多相关文章
- python中装饰器的原理
装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕 def outer(func): def inner(): print(" ...
- 8.Python中装饰器是什么?
Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...
- Python中装饰器(转)
本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生 ...
- 【转】【python】装饰器的原理
写在前面: 在开发OpenStack过程中,经常可以看到代码中的各种注解,自己也去查阅了资料,了解了这是python中的装饰器,因为弱类型的语言可以将函数当成返回值返回,这就是装饰器的原理. 虽然说知 ...
- python中装饰器修复技术
python装饰器@wraps作用-修复被装饰后的函数名等属性的改变 Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变), 为了 ...
- python中装饰器的执行细节
本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...
- python中装饰器(语法糖)概念
“”“” 什么是装饰器? """ 还是通过一个例子来慢慢说明 先看下面的例子 def func_1(x): return x*2 def fun_2(x): return ...
- Python核心技术与实战——十四|Python中装饰器的使用
我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...
- Python中装饰器的用法
定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ...
随机推荐
- Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡
周末的时候一个正在学Linux的朋友问我,高可用怎么玩?我和他微信了将近三个小时,把Nginx和haproxy双主高可用教给他了,今天突然想把这个给写进博客里,供给那些正在学习Linux系统的朋友们, ...
- collections.namedtuple()命名序列元素
## collections.namedtuple()命名序列元素 from collections import namedtuple Student = namedtuple("Stud ...
- PHP变量定义及工作原理
1.变量定义: 通常学到的是,变量代表存储空间以及其中数据的一个“标识符”. 变量名 指向 变量值 更深入的说是 变量指向内存的一块区域 2.变量工作原理,通过画图分析法——内存空间 <?php ...
- MFC非模态添加进程控件方法二(自定义消息方法)
以下内容有大部分转载自CSDN,经过自己整理完成. 该文主要的方法为在非模态对话框中自定义一组消息函数,然后在主窗口中开辟一个线程通过线程把消息传递给子窗口进行更新. 在子窗口类中定义消息如下: /* ...
- python3 练习题100例 (二)
题目二:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:20万到40万 ...
- 472. Concatenated Words
class Solution { public: vector<string> res; vector<string> findAllConcatenatedWordsInAD ...
- 《JQuery常用插件教程》系列分享专栏
<JQuery常用插件教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201719.html 文章 使用jquery插件实现图 ...
- STM32_3 时钟初始化分析
在startup文件中,调用了2个函数,一个是System_Init, 另一个是main. System_Init()在system_stm32f10x.c 这个文件中,先看一下时钟树,再分析一下这个 ...
- VS2005源代码视图出现了小蓝点,怎么弄掉?
VS2005源代码视图出现了小蓝点,怎么弄掉? 编辑->高级->查看空白行 就OK啦~ 这个查看空格的.. 或者Ctrl+E,S
- BZOJ2730_矿场搭建_KEY
题目传送门 这道题用Tarjan求出点-双连通分量,对联通块做一些玄学操作. 细节很多,不说了看code. code: /*************************************** ...