一、装饰器的形成过程

1.函数无参数,无返回值

import time

def f1():   # 无参数,无返回值
time.sleep(1)
print("Hello, World!") def timer(f): # f 是函数名
def inner(): # 闭包
start = time.time()
f()
end = time.time()
total = end - start
print(total)
return inner f1 = timer(f1) # 调用timer()函数,获取inner函数名指向的内存地址的返回值
f1()

2.函数有返回值,无参数

import time

def f1():   # 无参数,有返回值
time.sleep(1)
print("Hello, World!")
return True def timer(f): # f 是函数名
def inner(): # 闭包
start = time.time()
ret = f()
end = time.time()
total = end - start
print(total)
return ret
return inner f1 = timer(f1) # 调用timer()函数,获取inner函数名指向的内存地址的返回值
ret = f1()
print(ret)

3.函数有参数,有返回值

def f1(a, **kwargs):   # 参数,返回值 *args和**args可以组成任意类型的参数
time.sleep(1)
print("Hello, World!", a, kwargs)
return "abc" def timer(f): # f 是函数名
def inner(*args, **kwargs): # 闭包
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
total = end - start
print(total)
return ret
return inner f1 = timer(f1) # 调用timer()函数,获取inner函数名指向的内存地址的返回值
ret = f1(1, name='tom')
print(ret)

二、装饰器的作用

在不改变函数调用方式的情况下,在原函数的前后添加功能

三、开放封闭原则

开放:对扩展开放

封闭:对修改封闭

这是装饰器开发的原则

四、语法糖

简化代码

import time

def timer(f):   # f 是函数名
def inner(*args, **kwargs): # 闭包
start = time.time()
ret = f(*args, **kwargs)
end = time.time()
total = end - start
print(total)
return ret
return inner @timer # f1 = timer(f1),语法糖简化代码
def f1(a, **kwargs): # 参数,返回值 *args和**args可以组成任意类型的参数
time.sleep(1)
print("Hello, World!", a, kwargs)
return "abc" ret = f1(1, name='tom')
print(ret)

五、装饰器的固定模式

def wrapper(f):     # 装饰器
def inner(*args, **kwargs):
# 在原函数(被装饰)前增加的功能
ret = f(*args, **kwargs) # 被装饰的函数
# 在原函数(被装饰)后增加的功能
return ret
return inner @wrapper # f1 = wrapper(f1)
def f1(*args, **kwargs):
print("Hello World!", args, kwargs)
return args ret = f1('a', 'b', name='tom') # f1指向的内存地址是inner指向的内存地址
print(ret)

巧记:1.先定义函数,再定义内部函数,返回内部函数的函数名

   2.内部函数内放被装饰的函数,传进被装饰函数的函数名

   3.被装饰的参数需要参数和返回值

PS:参数的传递:接收聚合,调用打散

python 装饰器-初识的更多相关文章

  1. python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

  2. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  3. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  4. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  5. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  6. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  7. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  8. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  9. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

随机推荐

  1. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(12)之后台功能总结

    源码下载地址:http://www.yealuo.com/Sccnn/Detail?KeyValue=c891ffae-7441-4afb-9a75-c5fe000e3d1c 几个后台功能模块的完成也 ...

  2. 【GYM102091】2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest

    A-Evolution Game 题目大意:有$n$个不同的野兽,定义第$i$ 个野兽有 $i$ 个眼睛和 $h[i]$ 个角,你可以任意从中选择一个野兽进行进化,每次进化角数量必须增加,而且进化后要 ...

  3. 轮播图模块(vue)

    轮播图模块(vue) 通过属性方式传值 值为一个数组.每一项含有imgUrl(图片地址).link(跳转链接),link为可选属性 <template> <div class=&qu ...

  4. 基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎

    基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎 网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并 ...

  5. 大数据vs计算机

    大数据有两个方向,一个是偏计算机的,另一个是偏经济的.你学过Java,所以你可以偏将计算机 基础1. 读书<Introduction to Data Mining>,这本书很浅显易懂,没有 ...

  6. Tomcat 类加载器打破双亲委派模型

    我们分为4个部分来探讨: 1. 什么是类加载机制? 2. 什么是双亲委任模型? 3. 如何破坏双亲委任模型? 4. Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复 ...

  7. freemarker<二>

    一.FreeMarker模板文件组成 ①.文本,直接输出的部分 ②.注释,即<#--...-->格式不会输出 ③.FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区 ...

  8. $Noip2013/Luogu1966$ 火柴排队 贪心+离散化+逆序对

    $Luogu$ $Description$ 给定等长的$a,b$两个序列.每次可以交换一个序列中相邻两个数.求最小的交换次数使得$\sum(a_i-b_i)^2$最小. $Sol$ 交换后的序列一定满 ...

  9. 自定义Django Admin界面

    目录 模型 注册模型 定制页面 模型 # app/model.py class Question(models.Model): question_text = models.CharField(max ...

  10. Ecshop在模板中判断用户是否登陆,获取用户等级信息

    ecshop模板中smarty怎样判断用户等级.用户id.用户昵称用户名,请看以下方法,使用全局变量 <!-- {if $smarty.session.user_rank gt 1}--> ...