一、装饰器的形成过程

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. Character.digit()的意义

    最近在阅读Integet.parseInt()源码时,遇到了Character.digit()这个方法,以前没有遇到过,更没使用过,这里查了资料就记录一下. 官方说法是: java.lang.Char ...

  2. HTTP请求各参数详解

    HTTP Request的Header信息 1.HTTP请求方式 如下表: GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并 ...

  3. 【Bad Blood】翻译0

    (一)作者注 本书基于对超过150人以上的上百个采访,包括60多个Theranos的职工而著成.叙述中出现的人物大多数都是他们的真实姓名,也有些人希望我隐藏身份信息,他们有些害怕公司的惩罚,有些担心会 ...

  4. JavaSE基础---异常

    异常 Throwable----具备可拋性:就是该体系中的类和对象都可以被关键字throw或throws所操作. |---Error ---错误,一般不编写针对性处理方式 |---Exception- ...

  5. hdu 6579 Operation (在线线性基)

    传送门 •题意 一个数组a有n个数 m个操作 操作① 询问$[l,r]$区间的异或值 操作② 在数组末尾追加一个数x,数组长度变为$n+1$ 其中$l,r$不直接给出,其中$l=l%n+1,r=r%n ...

  6. 【31.93%】【codeforces 670E】Correct Bracket Sequence Editor

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. [Linux] 利用tcpdump和strace进行debug

    比如说要查看所有的sql查询语句,数据库的端口是3306 tcpdump -i any port 3306 -l -s 0 -w -|strings|grep -A 5 select 要查看所有的调用 ...

  8. vs指定QT的工作目录(依赖第三方动态库时,这时vs编译出来后,运行会提示缺少动态库)good

    当一个工程依赖第三方动态库时,这时vs编译出来后,运行会提示缺少动态库.解决方法: 项目->属性->调试: 工作目录:指定程序运行时的目录 环境:指定程序运行时的环境变量 我们可以在环境变 ...

  9. springcloud玩转单点登录【oauth】

    随着公司项目的庞大,单点登录变得尤为重要,那么怎么实现单点登录,下面已oauth为标准实现单点登录. [特别鸣谢:魔乐科技,附上官网:www.mldn.cn] 1:项目组织结构 本项目为oAuth修改 ...

  10. mysql:创建新库,新表,查看character

    创建新库create database wenda; 创建新表drop table if exists `user`;create table `user`( `id` int(11) unsigne ...