1、什么是装饰器?

#在不改变原函数的调用的情况下,为原函数增加一些额外的功能,打印日志,执行时间,登录认证

2、装饰器的形成过程

# 需求写一个函数测试另一个函数的执行效率
最初的实现方式,但是改变了函数的调用方式,需要改进
def timer(f1):
start_time = time.time()
f1()
end_time = time.time()
print(end_time- start_time) timer(func1)
改进后调用方式基本相似,但是多加了两行代码

def timer(f1):
start_time = time.time()
f1()
end_time = time.time()
print(end_time- start_time) f = func1
func1 = timer
func1(f) #== timer(func1)
最优的方法
def timer(f1):
def inner():
start_time = time.time()
f1()
end_time = time.time()
print(end_time - start_time)
return inner
func1 = timer(func1) #做下关系转换
func1()
通过python提供的语法塘实现装饰器
def timer(f1):
def inner():
start_time = time.time()
f1()
end_time = time.time()
print(end_time - start_time)
return inner @timer == func1 = timer(func1)
def func1():
print("晚上回去吃烧烤")
time.sleep(0.3)
@timer == func2 = timer(func2)
def func2():
print("晚上回去和啤酒")
time.sleep(0.3)
func1()
func2()
# 装饰器传参
def timer(f1):
def inner(*args, **kwargs):
start_time = time.time()
f1(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return inner @timer #== func1 = timer(func1)
def func1(a, b):
print("晚上回去吃烧烤")
time.sleep(0.3)
@timer #== func2 = timer(func2)
def func2(a, b):
print("晚上回去和啤酒")
time.sleep(0.3) func1(111,222) #参数首先传到inner()函数 *args,然后在传到f1()函数中
func2(222,333)
# 函数返回值
def timer(f1):
def inner(*args, **kwargs):
start_time = time.time()
ret = f1(*args, **kwargs)
end_time = time.time()
print(end_time - start_time)
return ret
return inner @timer #== func1 = timer(func1)
def func1(a, b):
print("晚上回去吃烧烤")
time.sleep(0.3)
return 666
ret = func1(1, 2)
print(ret)
装饰器的写法规范
def wrapper(f1):
def inner(*args, **kwargs):
执行函数之前的操作
ret = f1() #返回值
执行函数之后的操作
return ret
return inner

day3之装饰器的更多相关文章

  1. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  2. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  3. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  4. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  5. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  6. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

  7. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

  8. python --> 递归 以及装饰器

    一.递归知识 函数迭套执行,逐层执行之后,满足某个条件之后就会停止执行,将return值返回上层的函数,上层函数再逐层返回,最终返回给最初始函数. 递归在斐波那契数列的应用[斐波那契数列特点:前两个数 ...

  9. python 装饰器的理解

    一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...

随机推荐

  1. vue-cli 上手

    1.cnpm install --global vue-cli 安装脚手架 2.vue init webpack baoge 创建 3.选择配置项 Project name (baoge): ---- ...

  2. 【转】Java自学之路——by马士兵

    作者:马士兵老师 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟 ...

  3. (3)shiro自定义realm

    上面一章说到shiro的认证和授权最底层就是调用realm的getAuthorizationInfo(获取用户的角色和资源)和getAuthenticationInfo(校验账号密码是否正确)两个方法 ...

  4. scala spark 调用hivecontext

    import org.apache.spark.rdd.RDD def save(data: RDD[ModelReplay], modelKey: String, dt: String): Unit ...

  5. linux一些基本常识(三)

    acl:对本身权限的扩展    打包:zip 111.zip a.txt b.txt.....    zip -r /etc/sysconfig/* (样才能第归所有内容0)    解宝:uzip 1 ...

  6. like模糊查询

    1. ${}获取值,直接连接 name like '%${search_content}%' 2.CONCAT()函数 MySQL的 CONCAT()函数用于将多个字符串连接成一个字符串,是最重要的m ...

  7. Appium的inspector使用

    使用inspectot可以对元素进行定位 1.设置appium的Android Settings,点击左上角的安卓图标进入安卓设置,注意设置时不要开启appium 说明: a)Application是 ...

  8. 索引与like优化

    未建索引 mysql> alter table modulestatus drop index imei;Query OK, 457922 rows affected (4.29 sec)Rec ...

  9. jquery 赋值时不触发change事件解决

    $("#optionsId").change(function(){ $("#selectOptionsText").val('测试'); }); $(&quo ...

  10. linux-Centos 7下mysql 5.7.9的rpm包安装

    操作系统:Centos 7.1 mysql数据库版本:mysql5.7.18 1.安装新版mysql之前,我们需要将系统自带的mariadb-lib卸载 [root@123 ~]# rpm -qa|g ...