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. [OpenCV][关于OpenCV3.2.0+VS2015+Win10环境搭建]

    在VS2015上搭建OpenCV3.2.0+Win10 1.OpenCV3.2.0在VS2015上的配置 1).下载.解压OPENCV 登陆OpenCV官方网站下载相应版本的OpenCV-SDK 这里 ...

  2. PAT A1127 ZigZagging on a Tree (30 分)

    Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...

  3. Python 爬虫 (一)

    爬: 爬一个网站需要几步? 确定用户的需求 根据需求,寻找网址 读取网页 urllib request requests 定位并提取数据 正则 xpath beautiful soup 存储数据 my ...

  4. ubantu忘记登录密码怎么办?(ubantu16.04)

    刚知道有虚拟机的时候为了那啥(咳咳),花了好几天的时间装了很多的操作系统,像什么os x.kali.red hat.以前的win7什么的,甚至还有一个Android的虚拟机……扯偏了,然后最近学习到了 ...

  5. N个点中寻找多个最近两点的计算O(N²)

    #include<math.h> #include<stdio.h> #include<stdlib.h> typedef struct point { float ...

  6. 如何把C盘里的文件默认位置更改到D盘指定目录?

    如何把C盘里的文件默认位置更改到D盘指定目录? 1.打开运行,输入 %HOMEPATH% 2.以”桌面”文件转移到D盘目录为例(其他文档类比进行操作) 3.鼠标右键”桌面”----选择属性-----定 ...

  7. Android远程推送笔记

    Android远程推送笔记 Android推送有很多种实现方案,但都没办法和苹果的APNS比拟,这里主要来讲述一下我遇到的问题,和作出的抉择. 首先,为了快速接入,所以就没有自己搭建推送服务器,而是使 ...

  8. SpringBoot学习:整合MyBatis,使用Druid连接池

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)添加pom依赖: <!-- https://mvnrepository.co ...

  9. 「Python」Numpy equivalent of MATLAB's cell array

    转自Stackoverflow.备忘用. Question I want to create a MATLAB-like cell array in Numpy. How can I accompli ...

  10. 消费者用nginx做负载均衡,提供者用zookeeper自带功能实现负载均衡

    公司的项目基于阿里的Dubbo微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现Dubbo的分布式服务 ...