首页 > 编程语言 >[编程基础] Python装饰器入门总结

[编程基础] Python装饰器入门总结

时间:2022-12-17 20:03:42浏览次数:100  
标签:return 入门 Python 编程 wrapper myfun print 函数


Python装饰器教程展示了如何在Python中使用装饰器基本功能。

文章目录

  • ​​1 使用教程​​
  • ​​1.1 Python装饰器简单示例​​
  • ​​1.2 带@符号的Python装饰器​​
  • ​​1.3 用参数修饰函数​​
  • ​​1.4 Python装饰器修改数据​​
  • ​​1.5 Python多层装饰器​​
  • ​​1.6 Python装饰器计时示例​​
  • ​​2 参考​​

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 参考

​http://zetcode.com/python/python-decorators/​


标签:return,入门,Python,编程,wrapper,myfun,print,函数
From: https://blog.51cto.com/luohenyueji/5950112

相关文章

  • [编程基础] Python随机数生成模块总结
    Python随机数生成模块教程演示如何在Python中生成伪随机数。文章目录​​1介绍​​​​1.1随机数字生成器​​​​1.2Pythonrandom模块​​​​1.3随机种子​​​​2......
  • [编程基础] Python格式化字符串常量f-string总结
    Python格式化字符串常量f-string总结本文主要总结在Python中如何使用格式化字符串常量f-string(Formattedstringliterals)。在Python程序中,大部分时间都是使用%s或fo......
  • [图像处理]YUV图像处理入门5
    12yuv420转换为rgb(opencvmat)yuv格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式,而且自己造轮子工作量太大。因此通常都会将yuv转换为rgb,再用......
  • [图像处理]YUV图像处理入门3
    5yuv420格式的灰阶测试图本程序中的函数主要是为YUV420P视频数据流的第一帧图像添加边框。函数的代码如下所示:/***@file5yuv_graybar.cpp*@authorluohen*@briefg......
  • [图像处理]YUV图像处理入门4
    9yuv420图像截取本程序中的函数主要是对YUV420P视频数据流的第一帧图像进行截取。类似opencv中的rect函数,函数的代码如下所示:/***@file9yuv_clip.cpp*@authorluohen......
  • [图像处理]YUV图像处理入门2
    1分离YUV420中YUV分量本程序中的函数主要是将YUV420P视频数据流的第一帧图像中的Y、U、V三个分量分离开并保存成三个文件。函数的代码如下所示:/***@file1yuv_split.cp......
  • [图像处理]YUV图像处理入门1
    目前数字图像处理技术已经应用生活各个方面,但是大部分教程都是利用第三方库(如opencv)对RGB图像格式进行处理。对于YUV图像格式的图像处理教程较少。于是博主搬运总结了多个......
  • Python+QT美颜工具源码
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • 【Python】爬虫笔记-ConnectionResetError(10054)
    0x01在对网站图片进行批量爬取的过程中遇到了一个典型问题:requests.exceptions.ConnectionError:('Connectionaborted.',ConnectionResetError(10054,'Anexisting......
  • Python写个“点球大战”小游戏
    大家好,欢迎来到Crossin的编程教室!看过我Python入门教程的朋友应该会看到其中有提到一个点球小游戏的作业。在世界杯决赛即将到来之际,我们再来回顾一下这个小游戏。......