python 装饰器-初识
一、装饰器的形成过程
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 装饰器-初识的更多相关文章
- python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
随机推荐
- 2018-8-10-win10-uwp-MVVM-语义耦合
title author date CreateTime categories win10 uwp MVVM 语义耦合 lindexi 2018-08-10 19:16:53 +0800 2018-2 ...
- POJ 1511 Invitation Cards(逆向思维 SPFA)
Description In the age of television, not many people attend theater performances. Antique Comedians ...
- 20191029校内ACM部分题解
20191029校内ACM部分题解 https://codeforces.com/group/32W4q7bPme/contest/257710 B数学 给定一个在\([0,1]\)等概率随机区间的随 ...
- 2019-9-22-dotnet-core-导出-COM-组件
title author date CreateTime categories dotnet core 导出 COM 组件 lindexi 2019-09-22 20:25:38 +0800 2019 ...
- vue-router再学习
vue路由: 1:动态路由配置 import Vue from 'vue' import Router from 'vue-router' import Index from '@/view/inde ...
- 纯CSS制作空心三角形和实心三角形及其实现原理
纯CSS制作空心三角形和实心三角形及其实现原理 在一次项目中需要使用到空心三角形,我瞬间懵逼了.查阅了一些资料加上自己的分析思考,终于是达到了效果,个人感觉制作三角形是使用频率很高的,因此记录下来,供 ...
- CSS 高度居中方案
实现高度自适应并且上下居中 <div id="wrap"> <div class="box">DemoSeat</div> ...
- Vue____实现本地代码推送到云端仓库的相关操作
项目初始化搭建完毕,每进行一个功能模块开发的必备操作,目的是方便协同开发以及备份代码 一.每开发一个新功能,都应该创建一个新分枝,待该功能模块开发完成以后,再合并到主分支master中,具体步骤如下: ...
- 微服务Dubbo和SpringCloud架构设计、优劣势比较
本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...
- beta week 1/2 Scrum立会报告+燃尽图 01
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9911 git地址:https://e.coding.net/Eustia ...