[编程基础] Python装饰器入门总结
Python装饰器教程展示了如何在Python中使用装饰器基本功能。
文章目录
1 使用教程
Python函数是一等公民。这意味着函数与Python中的其他对象具有同等的状态。可以将函数分配给变量,存储在集合中,动态创建和删除或作为参数传递。嵌套函数也称为内部函数,指的是在另一个函数中定义的函数。
Python decorator扩展并修改可调用函数的行为,而不修改可调用函数本身。decorator是修饰(或包装)其他函数并在包装函数运行前后执行代码的函数。Python装饰器通常用于日志记录,身份验证和授权,计时和缓存中。
1.1 Python装饰器简单示例
在这个示例中,简单创建一个简单的装饰器示例。
# 以函数作为参数
def enclose(fun):
# wrapper*()用星好装饰传递过来的函数,将返回包装函数。
def wrapper():
print("***************************")
fun()
print("***************************")
# 返回包装函数
return wrapper
# 这是要装饰的常规函数
def myfun():
print("myfun")
# enclose()函数是类似decorator,它通过在输出中添加星形符号来扩展myfun函数的输出。
# myfun被传递给enclosure()函数,在该函数中对其进行了扩展。将返回并调用包装函数。
enc = enclose(myfun)
# 调用包装函数
enc()
***************************
myfun
***************************
1.2 带@符号的Python装饰器
Python允许使用@符号来标记要用decorator装饰的方法。从功能上讲,该示例与上一个示例相同。仅使用不同的语法。
def enclose(fun):
def wrapper():
print("***************************")
fun()
print("***************************")
return wrapper
# @enclose 就是enc = enclose(myfun)简写
# 表明调用enclose函数修饰myufun函数,并返回修饰函数
@enclose
def myfun():
print("myfun")
myfun()
***************************
myfun
***************************
1.3 用参数修饰函数
下面的示例演示如何装饰带有参数的函数。
def enclose(fun):
def wrapper(val):
print("***************************")
fun(val)
print("***************************")
return wrapper
@enclose
def myfun(val):
print(f"myfun with {val}")
myfun('falcon')
***************************
myfun with falcon
***************************
以下例子展示了如何使用*args,**kwargs语法处理可变数量的参数。
def enclose(fun):
def wrapper(*args, **kwargs):
print("***************************")
fun(*args, **kwargs)
print("***************************")
return wrapper
@enclose
def myfun(name, age):
print(f'{name} is {age} years old')
myfun(name='Peter', age=32)
myfun('Roman', 29)
***************************
Peter is 32 years old
***************************
***************************
Roman is 29 years old
***************************
1.4 Python装饰器修改数据
decorator函数可以修改修饰函数的数据。
def uppercase(fun):
# 在包装函数内部,修改并返回了文本
def wrapper():
res = fun()
modified = res.upper()
return modified
return wrapper
# @uppercase decorator将返回的文本更改为大写
@uppercase
def gen_message():
return 'Hello there!'
msg = gen_message()
print(msg)
HELLO THERE!
1.5 Python多层装饰器
可以在一个函数上应用多个装饰器。以下示例在文本上应用了两个HTML标签。
def strong(fun):
def wrapper():
return f'<strong>{fun()}</strong>'
return wrapper
def em(fun):
def wrapper():
return f'<em>{fun()}</em>'
return wrapper
# 先调用em装饰器,再调用strong装饰器
@strong
@em
def message():
return 'This is some message'
print(message())
<strong><em>This is some message</em></strong>
1.6 Python装饰器计时示例
在下面的示例中,我们在函数上应用计时器装饰器。下面示例使用decorator计算factoria()函数运行的时间。
import time
import math
def timer(func):
def wrapper(*args, **kwargs):
# 在函数运行之前,我们获得了开始时间。
begin = time.time()
f = func(*args, **kwargs)
# 获得结束时间
end = time.time()
print("Total time taken in : ", func.__name__, end - begin)
return f
return wrapper
@timer
def factorial(num):
return math.factorial(num)
f = factorial(4580)
Total time taken in : factorial 0.0005843639373779297
2 参考
[编程基础] Python装饰器入门总结的更多相关文章
- Python 装饰器入门(上)
翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...
- [python 基础]python装饰器(一)添加functools获取原函数信息以及functools.partial分析
python装饰器学习的时候有两点需要注意一下 1,被装饰器装饰的函数取其func.__name__和func.func_doc的时候得到的不是被修饰函数的相关信息而是装饰器wrapper函数的doc ...
- python -- 装饰器入门
用例: 统计函数执行需要的时间 假设我们执行的一段代码的运行时间比我们预想的时间要久,而这段代码块有多个函数调用组成,我们有理由相信至少是其中的一个函数调用导致整个代码块产生了瓶颈.我们如何去发现导致 ...
- Python 装饰器入门(下)
继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...
- [python 基础]python装饰器(二)带参数的装饰器以及inspect.getcallargs分析
带参数的装饰器理解无非记住两点: 1.本质不过在基本的装饰器外面再封装一层带参数的函数 2.在使用装饰器语法糖的时候与普通装饰器不同,必须要加()调用,且()内的内容可以省略(当省略时,admin默认 ...
- python装饰器入门
按别人的教程弄的. 要清楚基于类和基于函数的实现的不同之处. #!/usr/bin/env python # -*- coding: utf-8 -*- ''' class entryExit(obj ...
- [python基础]关于装饰器
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
- 【转】Python装饰器与面向切面编程
原文请参考: http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html 今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切 ...
随机推荐
- Containerd-1.6.5 镜像容器操作
一.Containerd 镜像操作 1 基本参数 [root@ecs-65685 ~]# ctr c NAME: ctr containers - manage containers USAGE: c ...
- ssh端口映射 解决服务器使用tensorboard的问题
有时会在服务器上使用tensorboard,然而本地无法直接访问tensorboard结果网页.这时候使用端口映射即可.比如tensorboard上占用的是 6006 端口,也就是说结果在服务器的 l ...
- [Mysql] 两段提交
事务提交 Mysql 默认开启自动提交事务 两段提交 把一个事务分成两个阶段来提交,就是把redolog拆分成了prepare和commit两段 MySQL想要准备事务的时候会先写redolog.bi ...
- 2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
文章目录 1.maven下载 2.maven环境变量的配置 3.查看maven是否配置成功 4.配置文件的修改 5.IDEA集成maven 6.导入项目时jar包下载不成功的问题解决 maven教程: ...
- llinux下mysql建库、新建用户、用户授权、修改用户密码
1.创建新的数据库 1.1.root用户登录mysql mysql -u root -p 1.2.查看现有数据库 show databases; 1.3.新建数据库,此命名为cjc create ...
- python导包
我们将完成特定功能的代码块放在一个.py结尾的文件中,这个文件被称为模块.在这个模块中可能包含变量,函数,类等等内容. 当我们从外部需要用到这个模块时,就需要将这个模块导入到我们当前环境.导入方式有以 ...
- OpenMP 入门
OpenMP 入门 简介 OpenMP 一个非常易用的共享内存的并行编程框架,它提供了一些非常简单易用的API,让编程人员从复杂的并发编程当中释放出来,专注于具体功能的实现.openmp 主要是通过编 ...
- javaWEB中的四种域对象
javaWEB中的四种域对象 (1)ServletContext ServletContext是最大的Web域对象,在整个工程内有效,可以存储一些需要全局部署的配置文件,也可以存储其他信息,不过因为它 ...
- 检测轮廓 获取其最值的坐标 opencv-python
一.基础知识 图像清晰度评价算法有多种 空域中,主要考察图像的邻域对比度,即相邻像素间灰度特征的 梯度差: 频域中,主要考察图像的频率分量,清晰的图像高频分量多,模糊的图像低频分量多. 灰度值 把白色 ...
- day14-HTTP01
HTTP协议 1.什么是HTTP协议? 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用广泛的一种网络协议.是工作在tcp/ip协议基础上的,所有的ww ...