首页 > 编程语言 >Python 装饰器

Python 装饰器

时间:2023-12-31 21:47:27浏览次数:32  
标签:return Python print decorator fun 装饰 def

Python 装饰器

python装饰器的本质是: 仅以一个函数为参数,并返回一个函数。 且看以下案例:

def decorator(f):
	print(f.__name__)
	return f

# 1
@decorator
def fun():
	print("run fun")
# 2
fun = decorator(fun)

以上两种写法是等价的;装饰器函数会在被装饰的函数 定义完成时执行。

装饰器优点:

  • 不会改变被装饰函数的调用
  • 不用修改被装饰函数的代码

根据使用场景装饰器可以分为几种:

一次性装饰器

一次性装饰器;不对被装饰函数进行任何操作,原样返回被装饰的函数;仅在被装饰函数定义时进行操作。

funcs = []

def decorator(f):
	funcs.append(f)	# 将函数保存到全局list中去
	return f

@decorator
def fun():
	print("run fun")

包装装饰器

包装装饰器;一般是在被装饰函数执行前后做一些额外的操作,或者对被装饰函数计算的结果进行操作。

import time

def decorator(f):
	def wrapper(*args, **kwds): # 不确定被装饰函数的参数,使用万能形参
		t1 = time.time()
		result = f(*args, **kwds) # 执行被装饰函数
		t2 = time.time()
		print(f.__name__, "执行耗时", t2-t1)
		return result
	return wrapper

@decorator
def fun():
	time.sleep(2)
	print("run fun")
# fun = decorator(fun)
# 此时 fun 已经变成了 wrapper 函数;已经被decorator返回的wrapper覆盖

配置装饰器

即有带参数的装饰器,此装饰器可能是为了给被装饰函数提供额外的信息;或者需要用户自己添加配置。
我们只看wrapper函数是不是和上文的一次性装饰器一样呢

def decorator(name):
	def wrapper(f):
		f.name = name
		return f
	return wrapper

@decorator("fun1")
def fun():
	print("run fun")
# fun = decorator("fun1")(fun)

print(fun.name)
fun()

配置包装装饰器

配置包装装饰器,即有装饰器配置项和修改被包装函数执行流程的装饰器;

import time

def decorator(name): # 配置选项
	def setname(f): # 包装被装饰的函数
		f.name = name  # 闭包获取 配置选项
		def wrapper(*args, **kwds): # 返回的最终函数
			t1 = time.time()
			result = f(*args, **kwds) # 执行被包装的函数
			t2 = time.time()
			print(f.name, "执行耗时", t2-t1)
			return result
		return wrapper
	return setname

@decorator("fun1")
def fun():
	print("run fun")

类装饰器

@decorator本质是一次函数调用;对应到类上就是__init__()调用;即类的实例化。如果类实现了__call__()方法,类的实例对象就可以像函数一样调用。

class Decorator:
	def __init__(self, name):
		self.name = name
	
	def __call__(self, f):
		self.f = f
		return self.wrapper
	
	def wrapper(self, *args, **kwds):
		print(self.name)
		return self.f(*args, **kwds)
@Decorator("name")
def fun():
	print("run fun")

装饰类的装饰器

def decorator(cls):
	def wrapper(*args, **kwds):
		obj = cls(*args, **kwds)
		return obj
	return wrapper

@decorator
class Test:
	def __init__(self):
		pass

print(Test)
print(Test())

# <function decorator.<locals>.wrapper at 0x7fd9ecba5280>
# <__main__.Test object at 0x7fd9ecc22550>

多层装饰器

def a(f):
	print("a 装饰器执行")
	def _a():
		print("函数执行 调用_a 装饰器")
		return f()
	return _a

def b(f):
	print("b 装饰器执行")
	def _b():
		print("函数执行 调用_b 装饰器")
		return f()
	return _b
	
def c(f):
	print("c 装饰器执行")
	def _c():
		print("函数执行 调用_c 装饰器")
		return f()
	return _c

@a
@b
@c
def fun():
	print("fun run")
# fun = a( b( c(fun )) )
fun()
# -----程序输出—-----
# c 装饰器执行
# b 装饰器执行
# a 装饰器执行
# 函数执行 调用_a 装饰器
# 函数执行 调用_b 装饰器
# 函数执行 调用_c 装饰器
fun run

有什么建议意见请留言讨论

谢谢观看

浪费了你人生中的几秒真的很抱歉(≧ ﹏ ≦)

标签:return,Python,print,decorator,fun,装饰,def
From: https://www.cnblogs.com/main-warma/p/17938028

相关文章

  • Python教程(19)——python异常处理
    什么是异常在计算机编程中,异常(Exception)是指在程序执行过程中发生的错误或异常情况。当出现异常时,程序无法正常继续执行,因此需要采取一些特殊的措施来处理异常,以防止程序崩溃或产生意外结果。异常可以在程序中的任何地方发生,可能是由错误的输入、无效的操作、资源不足、硬件问题......
  • 【Python爬虫课程设计】大数据分析——东方财富石头科技股市数据分析
    一、选题课程背景在当今信息化时代,数据已成为驱动各行各业发展的重要力量。股市作为经济的晴雨表,其数据更是备受关注。东方财富网作为国内知名的财经网站,拥有海量的股市数据。随着大数据技术的不断发展,数据在各行各业的应用越来越广泛。股市作为经济的核心,其数据的价值不言而喻。......
  • Python趣味入门13:类中的各种变量
    小牛叔带你飞越类的门槛其中我们已知道定义变量在类中就表示为属性。但是在不同的位置定义变量会有不同的作用,并且采用不同的命名方式,也会让变量具有不同的作用本文假设有一个类指南针(compass),可想象成某个地图游戏中帮助主角寻找方向,也是本节主要的示例。1.类属性与实例属性c......
  • 一键打包,随时运行,Python3项目虚拟环境一键整合包的制作(Venv)
    之前我们介绍了如何使用嵌入式Python3环境给项目制作一键整合包,在使用嵌入式Python环境时,通常是作为另一个应用程序的一部分,而Python3虚拟环境是为了在开发过程中隔离项目所需的Python环境。虚拟环境允许我们在同一台计算机上的不同项目中使用不同的Python版本和软件包,而......
  • Reinforcement Learning in Python:实践指南
    1.背景介绍人工智能(ArtificialIntelligence,AI)是一门研究如何让计算机自主地学习、理解、推理和决策的科学。人工智能的一个重要分支是强化学习(ReinforcementLearning,RL),它研究如何让计算机通过与环境的互动来学习如何做出最佳决策。强化学习的目标是让计算机能够在不同的状态......
  • Python 深度学习:TensorFlow 和 PyTorch 实践
    1.背景介绍深度学习是人工智能领域的一个重要分支,它通过模拟人类大脑中的神经网络学习和决策,使计算机能够从大量数据中自动发现模式和关系。深度学习已经应用于图像识别、自然语言处理、语音识别、机器翻译等多个领域,取得了显著的成果。TensorFlow和PyTorch是目前最流行的深度学......
  • Python Machine Learning Projects: Building RealWorld Applications
    1.背景介绍人工智能和机器学习技术在过去的几年里取得了巨大的进步,这使得许多实际应用成为可能。这本书《16.PythonMachineLearningProjects:BuildingReal-WorldApplications》旨在帮助读者理解这些实际应用,并提供有关如何使用Python编写机器学习代码的实践指南。本书的目......
  • python学习笔记5(保留字、标识符、变量、基本数据类型)
    上一节学习了print复杂语法、input、注释、代码缩进本节内容:(一)保留字特殊意义的词,区分大小写#查看保留字importkeywordprint(keyword.kwlist)(二)标识符1、名字,组成:字母、下划线和数字数字不能开头注意不能有殊殊字符一般不以_开头,有特殊意义一般不以中文开头2、代码规范模块名称,a......
  • Python趣味入门12:初遇类与实例
    小牛叔用轻松有趣的故事,带你进入Python的编程世界。1、类一提到类大神们就经常说封装。说白了,封装即把围绕同一个对象相同的代码、数据整合在一起。比如在某段游戏代码中(比如熊猫厨房),有一个“面包”:1、游戏提供“烘烤”的操作。->很明显这是动作->类的方法2、面包有硬度指......
  • Python实搞:自动给文本标注拼音并输出excel
    一、为什么要搞?前几天有同学在讨论家中小盆友的作业问题,说连一些拼音作业的难度已经超出了能力范围,感叹自己已经比不上现在的小学生了。听得滋滋有味的我又产生了一个大胆的想法:使用Python自动在每个文字的上方标注拼音预期输出示例如下:二、准备如何搞?查阅一番资料后,发现一个神奇的......