装饰器详解|学习笔记

简介: 快速学习装饰器详解

开发者学堂课程【Python 入门 2020年版装饰器详解】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/639/detail/10349


装饰器详解

 

内容介绍

一、 复习上一节内容

二、 装饰器详解

 

一、复习上一节内容

1、上节讲的装饰器比较简单,当写了装饰器语法后,首先它会自动立刻调用函数,同时把demo函数传给fn参数,fn就指向

demo了,最后cal_time返回来一个inner函数,返回inner函数以后,当你再写demo的时候, demo不再是上面的demo了,而是装饰器函数返回的inner的值,现在写demo的时候其实调的是inner函数。

def cal_time(fn):

def inner():

start= time.time()

fn()

end = time.time()

print('代码耗时',end - start)

return  inner

@cal_time

def demo():

x=0

for i in range(1,100000000):

x+=i

print(x)

 

二、装饰器详解

1、如果有多个函数,比方说有一个foo函数,要计算一下这个代码的执行时间

def  foo():

print('hello')

time.sleep(3)

print('world')

如果直接写foo()它只会打印hello world,不会执行时间,因为现在调的是foo函数,要给它加装饰器,装饰完再来调foo。

@cal_time

def  foo():

print('hello')

time.sleep(3)

print('world')

foo()

再来执行,就会显示运行时间了。

2、如果要计算代码的执行时长,加一个装饰器就行了,如果不想计算了,再把这个装饰器去掉就行了,去掉之后它就是一个普通函数。

加装饰器这个foo也是inner,可以打印foo:print(‘foo=’,foo)。装饰器是比较高级的用法,而且有一点不太好理解,只要记住这个语法格式就行了,首先第一个要一个外部函数,它需要接收一个参数,这个参数待会会把函数传进来,然后这个外部函数要有一个返回值,返回的是内部函数,以后再调用这个函数的时候它会调inner函数, inner函数里又把fn也就是原来的被装饰的那个函数给调用了。

3、还有一个情况,如果写的不是print  x而是return x,

@cal_time

def demo():

x=0

for i in range(1,100000000):

x+=i

return x

demo()

要调一下demo,现在demo里面是有一个返回值的,运行看一下值多少,值算了但是结果拿不到令m=demo(),打印一下m:print(‘m的值是’,m),运行得到结果m是空的,原因是现在的demo已经不再是原来的demo,而是inner,这个inner里没有返回值,所以这个结果就拿不到,加一个s=fn,return s就行了。

def inner():

start= time.time()

s=fn()

end = time.time()

print('代码耗时',end - start)

return s

fn其实指的是原来的demo函数,拿到这个demo函数的执行结果,最后再把它返回回去,这样就拿到了,这个地方不是很难只要记住语法规范就行了。

4、计算1~n的值

@cal_time

def demo(n):

x= 0

for  i in range(1, n)

x +=j

return x

m=demo(100000000)

print('m的值是',m)

如果现在运行,结果会报inner多个参数, inner需要0个参数,但是给了一个,要记得demo已经不再是以前的demo,而是inner, inner不需要参数。

所以def inner()里写个参数x就可以了。现在运行fn又会报错了,因为s=fn(),fn才是原来的demo,现在demo需要参数,但是没有给到。

这个参数是1亿传给x,然后再传给fn来进行计算,这个结果就能够算出来了。

5、inner返回的就是1到1亿的所有数字之和,耗时的时间是把它打印出来了,如果想返回两个值的话可以这样写

def inner(x):

start= time.time()

s=fn(x)

end = time.time()

return s, end-start

这样就是返回两个东西,再调demo的时候,m是两个数据,是元组,元组里的第0个数据会是算的和,第一个数据才是耗的时长。

m=demo(100000000)

print('m的值是',m)

只要记住一点,demo在运行时已经不再是原来的demo,而是这个inner函数,拿到的所有结果都看inner函数,它返回什么就是什么。

6、def inner(x)  x=100000000,要把1亿传给这个n:

def demo(n),x不是形参,是实参是调用,fn是demo函数,这么写就相当于demo把1亿传进去了。

7、在demo里有一个功能更强大,

m=demo(100000000,'good',y='hello')

print('m的值是',m)

这样写会报错,报错是因为demo现在调的是inner函数,inner只要一个参数,一个参数的话会报错,一般情况下, inner函数装饰完了之后,会这样写一个x,这个x是待会fn调的是要用的。

def  inner(x, *args, **kwargs):

这样写就能够传多个参数了,运行一下,现在它就可以传可变参数了,这是装饰器强大的一点,它对原有的函数进行了一个扩充,原有的函数只能传一个参数,现在可以传很多个。

相关文章
|
2月前
|
设计模式 开发框架 测试技术
探索Python编程中的装饰器
【9月更文挑战第36天】在Python的世界里,装饰器是一个既神秘又强大的工具。它们不仅能够增强函数的功能,还能让代码更加简洁和模块化。本文将通过实例介绍装饰器的基本概念、使用方法以及如何自定义装饰器,旨在帮助读者掌握这一实用技术,从而提升代码的可读性和复用性。
|
3月前
|
Python
探索Python编程中的装饰器魔法
【9月更文挑战第26天】在Python的世界里,装饰器就像是一把瑞士军刀,小巧而功能强大。它们让代码更简洁、可维护性更强。本文将通过实际示例,带你领略装饰器的魔力,从基础到进阶,一步步揭开它的神秘面纱。
22 2
|
3月前
|
缓存 开发者 Python
Python编程中的装饰器深入解析
【9月更文挑战第20天】本文将带领读者深入了解Python编程中一个强大且神秘的功能——装饰器。我们将从装饰器的基本概念出发,逐步探索它的工作原理、使用场景以及如何自定义装饰器。文章不仅会用通俗易懂的语言解释复杂的技术概念,还将通过实际代码示例展示装饰器的强大功能和灵活性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往更高效、更优雅代码编写的大门。
46 11
|
4月前
|
测试技术 Python
装饰器
【8月更文挑战第1天】
25 2
|
7月前
|
JavaScript
03_装饰器
03_装饰器
69 1
|
JavaScript 前端开发 编译器
StencilJs 学习之组件装饰器
Stencil 是一个生成 Web Components(更确切地说,是自定义元素)的编译器。Stencil 将最流行的框架的最佳概念结合到一个简单的构建时工具中。 现在让我们一起学习其中的装饰器部分。
111 0
|
7月前
|
Python
Python编程中的装饰器应用探索
【2月更文挑战第6天】本文将深入探讨Python编程中装饰器的应用,介绍装饰器的定义、作用以及实际应用场景,并结合示例代码详细阐释装饰器在函数、类等方面的灵活运用,帮助读者更好地理解和使用装饰器提升代码的可复用性和可维护性。
|
Python
Python编程 装饰器
Python编程 装饰器
107 0
|
JSON 数据格式
装饰器的实际应用
使用装饰器模式改造slf4j打印json格式日志
770 0
装饰器的实际应用
|
开发者 Python
装饰器的基本使用|学习笔记
快速学习装饰器的基本使用