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中装饰器的原理以及实现,的更多相关文章

  1. python中装饰器的原理

    装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕 def outer(func): def inner(): print(" ...

  2. 8.Python中装饰器是什么?

    Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...

  3. Python中装饰器(转)

    本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生 ...

  4. 【转】【python】装饰器的原理

    写在前面: 在开发OpenStack过程中,经常可以看到代码中的各种注解,自己也去查阅了资料,了解了这是python中的装饰器,因为弱类型的语言可以将函数当成返回值返回,这就是装饰器的原理. 虽然说知 ...

  5. python中装饰器修复技术

    python装饰器@wraps作用-修复被装饰后的函数名等属性的改变 Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变), 为了 ...

  6. python中装饰器的执行细节

    本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...

  7. python中装饰器(语法糖)概念

    “”“” 什么是装饰器? """ 还是通过一个例子来慢慢说明 先看下面的例子 def func_1(x): return x*2 def fun_2(x): return ...

  8. Python核心技术与实战——十四|Python中装饰器的使用

    我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...

  9. Python中装饰器的用法

    定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ...

随机推荐

  1. spring-构建mvc工程

    SpringMVC基于模型-视图-控制器(MVC)模式实现,可以构建松耦合的web应用程序. 1.SpringMVC的请求过程 1)请求离开浏览器,并携带用户所请求的内容 2)DispatcherSe ...

  2. hadoop生态搭建(3节点)-11.storm配置

    # http://archive.apache.org/dist/storm/apache-storm-1.1.0/ # ======================================= ...

  3. 最小化的测试套件minimal_test的使用

    1:需要包含文件文#include <boost/test/minimal_test.hpp> 2:minimal_test内部实现了main(), 因此无需自己编写main()函数, 只 ...

  4. golang 正则表达式 匹配局域网

    做一个微服务,需要对http头域里的remoteip做访问限制:所有局域网都要鉴权,其中一些特殊ip,如网关地址,直接拒绝,防止公网访问.正则表达式很好的解决了这个,直接贴代码,读者拿来直接改改就能用 ...

  5. POJ2505 A multiplication game(博弈)

    题意 开始时$p = 1$,每次可以乘$2 - 9$,第一个使得$p \geqslant n$的人赢 问先手是否必胜 $1 <n <4294967295$ Sol 认真的推理一波. 若当前 ...

  6. 北京Uber优步司机奖励政策(1月11日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. Ubentu下命令行安装chrome浏览器

    前言: 最近在使用Ubuntu 系统.编译Android aosp 项目.准备写博客,但是Ubuntu 的默认浏览器 firefox 在写csdn 的时候,加载不出来.如下图 一直卡在这里. 这种情况 ...

  8. 韩国KT软件NB-IOT开发记录V150(2)FOTA差分包生成

    1. 生成差分包

  9. Redis系列二 Redis数据库介绍

    1.SELECT命令 通过查看配置文件可以知道Redis默认有17个库,从0-16. 默认是在0号库.选择库使用SELECT <dbid>命令.例如选择0号库  SELECT 0 2.DB ...

  10. Filter配置多个url-pattern

    java开发中会用的Filter过滤器,有时候开发需要,在一个Filter中需要配置多个过滤地址,即<url-pattern>,下面就说一下一个Filter过滤器中多个<url-pa ...