python--装饰器

[掌握]装饰器入门

语法糖

==目标:==掌握装饰器的快速使用。

装饰器本质上就是闭包,但装饰器有特殊作用,那就是:在不改变原有函数的基础上,给原有函数增加额外功能。

定义装饰器:

python 复制代码
def outer([外面参数列表]):
	def inner([内部参数列表]):
		新增额外功能代码
		....
		...[引用]
	return inner

使用装饰器的标准语法:

python 复制代码
# 语法糖
@outer
def 函数名():
	代码
	...

例如,一起来完成:

(1)我们知道,发表评论前是需要先登录的;

(2)接着,先定义有发表评论的功能函数;

(3)使用语法糖方式,在不改变原有函数的基础上,提示用户要先登录~。

python 复制代码
# 接下来,要对func函数进行增强,编写闭包
def outer(func):
    def inner():
        print('先要登录!')
        func()
        print('评论成功!')
    return inner  # inner函数本质上就是增强版的func函数

# 定义你要对哪个函数进行增强
@outer
def func():
    print('发表评论!')


if __name__ == '__main__':
    func()

==总结:==

(1)装饰器本质上就是闭包,作用是在不改变原有函数的基础上,给原有函数增加额外功能;

(2)要构成装饰器,要满足4个条件:有嵌套、有引用、有返回、()。==A、有额外功能==;B、有结果;

*传统方式

==目标:==了解装饰器的传统方式与执行流程。

定义装饰器:

python 复制代码
def outer([外面参数列表]):
	def inner([内部参数列表]):
		新增额外功能代码
		....
		...[引用]
	return inner

使用装饰器的传统方式语法:

传统方式

变量名 = outer([外面参数列表])

变量名([内部参数列表])

例如,一起来完成:

(1)我们知道,发表评论前是需要先登录的;

(2)接着,先定义有发表评论的功能函数;

(3)使用传统方式,在不改变原有函数的基础上,提示用户要先登录~;

(4)了解装饰器的执行流程。

python 复制代码
# 接下来,要对func函数进行增强,编写闭包
def outer(func):
    def inner():
        print('先要登录!')
        func()
        print('评论成功!')
    return inner  # inner函数本质上就是增强版的func函数

# 定义你要对哪个函数进行增强
def func():
    print('发表评论!')


if __name__ == '__main__':
    inner_func = outer(func)
    inner_func()

    

==总结:==

(1)使用装饰器时,应该优先考虑使用:();==A、语法糖==;B、传统方式;

(2)为了更好的了解装饰器的执行流程,可以通过装饰器的传统方式来了解。

[了解]函数分类

==目标:==了解函数的分类有哪些?

对于函数的使用,可以根据有无参数、有无返回值来进行分类。分为:

(1)无参无返回值的函数

(2)有参无返回值的函数

(3)无参有返回值的函数

(4)有参有返回值的函数

无参无返回值的函数的语法:

定义

def 函数名():

代码

...

调用

函数名()

有参无返回值的函数的语法:

定义

def 函数名(参数1, 参数2, ...):

代码

...

调用

函数名(值1, 值2, ...)

无参有返回值的函数的语法:

定义

def 函数名():

代码

...

return 值

调用

变量名 = 函数名()

有参有返回值的函数的语法:

定义

def 函数名(参数1, 参数2, ...):

代码

...

return 值

调用

变量名 = 函数名(值1, 值2, ...)
==总结:==

(1)我们会发现,函数的分类有4种,那么对应于装饰器也有4种;

(2)注意:对函数来分类,主要是根据有无参数和返回值来划分的。

[掌握]装饰无参无返回值的函数

==目标:==掌握如何装饰无参无返回值的函数。

当使用装饰器装饰无参无返回值的函数时,语法:

python 复制代码
def outer(func):
	def inner():
		新增额外功能代码
		....
		...[引用]
	return inner

例如,一起来完成:

(1)在给无参无返回值的原有函数求和计算结果之前;

(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...

python 复制代码
# 1.定义装饰器
def outer(func):
    def inner():   # 有嵌套
        print("=======正在努力计算中...========")   # 有额外功能
        func()  # 有引用
    return inner  # 有返回

# 2.使用装饰器
# 3.定义函数
@outer
def get_sum():
    a = 10
    b = 23
    sum = a + b
    print(f"两数之和为:{sum}")

# 4.调用函数
get_sum()

==总结:==

(1)当被装饰的函数没有参数时,对应定义的装饰器的内部函数也没有参数;

(2)注意:当被装饰的函数没有返回值时,对应定义的装饰器的内部函数也没有返回值.。

[掌握]装饰有参无返回值的函数

==目标:==掌握如何装饰有参无返回值的函数。

当使用装饰器装饰有参无返回值的函数时,语法:

复制代码
def outer(func):
    def inner(参数1, 参数2, ...):
        新增额外功能代码
        ....
        ...[引用]
    return inner

例如,一起来完成:

(1)在给有参无返回值的原有函数求和计算结果之前;

(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...。

def outer(func):

def inner(x,y): # 有嵌套
==总结:==

(1)请问:当被装饰的原有函数有参数时,装饰器的内部函数也有对应个数的参数,这句话正确吗?==A、正确==;B、错误。

[掌握]装饰无参有返回值的函数

==目标:==掌握如何装饰无参有返回值的函数。

当使用装饰器装饰无参有返回值的函数时,语法:

复制代码
def outer(func):
    def inner():
        新增额外功能代码
        ....
        ...[引用]
        return 值  # 要返回值
    return inner

例如,一起来完成:

(1)在给无参有返回值的原有函数求和计算结果之前;

(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...。

python 复制代码
# 1.定义装饰器
def outer(func):
    def inner():
        print("=====正在努力计算中...")
        result = func()
        return result
    return inner

# 2.使用装饰器
# 3.定义函数
@outer
def get_sum():
    a = 19
    b = 23
    sum = a + b
    return sum

# 4.调用函数
print(get_sum())

==总结:==

(1)当原有函数有返回值时,记住:装饰器的内部函数也需要返回结果,否则没有输出效果。

[掌握]装饰有参有返回值的函数

==目标:==掌握如何装饰有参有返回值的函数。

当使用装饰器装饰有参有返回值的函数时,语法:

复制代码
def outer(func):
    def inner(参数1, 参数2, ...):
        新增额外功能代码
        ....
        ...[引用]
        return 值  # 要返回值
    return inner

例如,一起来完成:

(1)在给有参有返回值的原有函数求和计算结果之前;

(2)添加一个友好提示(注意:不能改变源码):正在努力计算中...。

python 复制代码
# 接下来,要对func函数进行增强,编写闭包
def outer(func):
    def inner(a,b):  #被增强的函数func,有两个参数,则这里的inner也必须有两个参数,因为inner是增强版的func
        print('求和前!')
        result = func(a,b)
        return result     # 被增强函数有返回值,这里也必须有返回值 这里的return,一般返回被增强函数的返回值
    return inner  # inner函数本质上就是增强版的func函数

# 定义你要对哪个函数进行增强
@outer
def func(a,b):   # 有参无返回值
    return a+b


if __name__ == '__main__':
    result = func(10,20)
    print(result)

==总结:==

(1)当被装饰的原有函数有参有返回值时,定义的装饰器类型应该在内部函数中要有参数,也要有返回值;

(2)当要构成装饰器的条件时,需要满足:有嵌套、有引用、()、有额外功能。==A、有返回==;B、有装饰;

相关推荐
好看资源平台4 分钟前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python
凡人的AI工具箱8 分钟前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
chnming198724 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙25 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂26 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc33 分钟前
Python简介以及解释器安装(保姆级教学)
开发语言·python
孤独且没人爱的纸鹤36 分钟前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
程序伍六七37 分钟前
day16
开发语言·c++
羊小猪~~40 分钟前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
wkj00142 分钟前
php操作redis
开发语言·redis·php