python装饰器这一篇就够了

article/2025/8/27 20:33:35

前言

  1. 什么是装饰器

  2. 实现原理

  3. 实现效果

  4. 适用场景

装饰器:

  1. 装饰器的写法

  2. 装饰器的拓展 

  3. 装饰器的模板


  • 什么是装饰器呢? 

就是在特定条件下为某些函数再不改动函数体的时候为函数新添加一些功能,这就是装饰器

  •  实现原理:

基于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内置函数),执行函数时再在内层函数中执行闭包中的原函数

  • 实现效果:

可以在你改变函数内部代码和调用的前提下,实现在函数执行和执行拓展功能

  • 适用场景: 

多个函数系统统一在执行前后定义一些功能

关于前言我们了解这么多就够了,然后小编带着大家推导出装饰器


装饰器:

  • 装饰器的写法:

这里我们有一个需求,我们定义了5个函数,想在5个函数执行前和执行后都打印一句话:装饰器的学习。首先我们来写于一下没有装饰器的写法,话不多说直接上代码:

def a():passdef b():passdef c():passdef d():passdef e():pass

 先定义5个函数,再加上我们要打印的话:

def a():print("装饰器的学习")print("装饰器的学习")def b():print("装饰器的学习")print("装饰器的学习")def c():print("装饰器的学习")print("装饰器的学习")def d():print("装饰器的学习")print("装饰器的学习")def e():print("装饰器的学习")passprint("装饰器的学习")a()
b()
c()
d()
e()

运行一下:

 发现运行成功,但我们想如果我要修改打印的话就要都修改一次,特别麻烦,而且,这是5个函数如果是500个,我们还要一个一个的去加吗?这就有我们的装饰器了,首先我用装饰器修改下,再给大家解释。

def outer(origin):def inner():print("装饰器的学习")res = origin()print("装饰器的学习")return resreturn inner@outer
def a():pass@outer
def b():pass@outer
def c():pass@outer
def d():pass@outer
def e():passa()
b()
c()
d()
e()

运行一下:

发现这样我们也成功了,接下来小编来个大家解释

  • 首先: 

我们要明白@的作用,那我们的函数a来举例子@的作用就是帮我们执行一次a=outer(a),首先python将把我们的a变成参数传给outer函数,运行后再赋值给a,这就是@的作用。

  • 其次给大家解释一下自定的outer函数 

我自己称这个函数为@下函数的补丁函数,也就是装饰器函数还是拿a函数举例子,首先a函数变成参数传给了我们的outer函数,outer里又嵌套了一个inner函数 ,然后将函数a赋值给res,然后用return语句返回出结果,外层函数返回inner函数,也就是将inner函数运行一次,这就是工作流程。

  • 最后分别在各函数前加上装饰,最后运行出结果

 这就是装饰器的写法。

  • 装饰器的参数

这时我遇到一个问题如果函数内有参数而且每个函数的参数数量不同,我们应该怎末办,先看下面代码

def outer(origin):def inner():print("装饰器的学习")res = origin()print("装饰器的学习")return resreturn inner@outer
def a(g, e):pass@outer
def b(w):pass@outer
def c(u, y, t):pass@outer
def d(c):pass@outer
def e():passa()
b()
c()
d()
e()

 这时我们运行一下

 发现报错,是因为我们的装饰器内没有这两个参数,那可以在装饰器内设置两个参数,但问题是,有的函数内有3个参数,而有的函数内没有参数,那我们应该怎么办?

针对这个问题我们可以给装饰器设置动态参数,先看代码:

def outer(origin):def inner(*args, **kwargs):print("装饰器的学习")res = origin(*args, **kwargs)print("装饰器的学习")return resreturn inner@outer
def a(a1):print("我是一函数")@outer
def b(a1, a2):print("我是二函数")@outer
def c(a5, a6, a7):print("我是三函数")a(1)
b(2, 3)
c(4, 5, 6)

因为函数太多了,小编有点麻烦就剪了几个函数,但道理是相同的,这时我们再运行一下

 这样我们就成功了,以上就是装饰器的写法,接下来给大家拓展一下


  • 装饰器的拓展:(functools模块)

首先给大家引入一下这时教给大家几个魔法方法

.__name__获取函数名字
.__doc__获取函数内的注释

接下来我们实战一下

def outer(origin):def inner(*args, **kwargs):# 我是一个装饰器函数print("装饰器的学习")res = origin(*args, **kwargs)print("装饰器的学习")return resreturn inner@outer
def c(a5, a6, a7):# 我是个函数print("我是三函数")c(4, 5, 6)
print(c.__name__)
print(c.__doc__)

运行一下:

这时我们发现我要的是c函数,但给我反馈的是inner函数,这是为什么呢?

这就是工作原理,直接就把c函数装饰成了inner函数,那以后再工作中一定会要自己函数的名字,而不要我装饰后的函数,这样就可以让我们的函数装饰的更像,其实在以后中,都想装饰的更像,那我们应该怎末办?

这时就需要我们的第三方模块functools,直接上代码

import functoolsdef outer(origin):@functools.wraps(origin)def inner(*args, **kwargs):# 我是一个装饰器函数print("装饰器的学习")res = origin(*args, **kwargs)print("装饰器的学习")return resreturn inner@outer
def c(a5, a6, a7):# 我是个函数print("我是三函数")c(4, 5, 6)
print(c.__name__)
print(c.__doc__)

 这时再运行一下

这时我们发现,我们伪装成功了,这样就会让我们的装饰更像。


  • 装饰器模板:

接下来送给大家装饰器的模板,以后需要随时ctrl+c和ctrl+v

import functoolsdef outer(origin):@functools.wraps(origin)def inner(*args, **kwargs):# 这里书写需要装饰的功能res = origin(*args, **kwargs)return resreturn inner

记得要在需要装饰的函数前要写上@outer哦

总结:

综上,就是关于装饰器的所有知识点,希望大家能学到,最后希望大家多提宝贵意见,我们下期见。


http://chatgpt.dhexx.cn/article/EMDExDgO.shtml

相关文章

【Python】闭包与装饰器

1.闭包 闭包的本质就是函数的嵌套定义,即在函数内部再定义函数 闭包有两种不同的方式,第一种是“返回一个函数名称”,第二种是在函数内部就“直接调用” 闭包的定义:在一个外函数中定义了一个内函数,内函数里运用了…

Python装饰器的通俗理解

看了这篇文章终于搞懂了装饰器,原文有少许错误,但无伤大雅,改正后转载于此,一起学习。 在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久&#x…

什么是装饰器?

一、引出装饰器概念 引入问题: 定义了一个函数,想在运行时动态的增加功能,又不想改动函数本身的代码? 示例: 希望对下列函数调用增加log功能,打印出函数调用: def f1(x): return x*2 d…

Python自定义装饰器

文章目录 1.闭包2.不带参数的装饰器3.带参数的装饰器4.不定长参数的装饰器5.多重装饰器修饰6.返回值是装饰器7.装饰器类 Python学习笔记—装饰器 装饰器:从生活角度理解,是对一个东西进行装饰,增加它本身的一些功能和内容; Python…

Python的装饰器

前言: 🤡 作者简介:我是Morning,计算机的打工人,想要翻身做主人 🙈 🙈 🙈 🏠 个人主页:Morning的主页 📕系列专栏:&#…

装 饰 器

一,装饰器概念 装饰器本质上还是函数,让其它的函数在不做任何代码修改的情况下,增加额外的功能 所以说一句话:还是函数,记住奥 谈到一个原则:开发封闭原则 概念: 一个以函数作为参数并返回一…

学习TypeScript20(装饰器Decorator)

Decorator 装饰器是一项实验性特性,在未来的版本中可能会发生改变 它们不仅增加了代码的可读性,清晰地表达了意图,而且提供一种方便的手段,增加或修改类的功能 若要启用实验性的装饰器特性,你必须在命令行或tsconfig…

python装饰器详解

python中的装饰器(decorator)一般采用语法糖的形式,是一种语法格式。比如:classmethod,staticmethod,property,xxx.setter,wraps(),func_name等都是python中的装饰器。 装饰器,装饰的…

【Python】一文弄懂python装饰器(附源码例子)

目录 前言 一、什么是装饰器 二、为什么要用装饰器 三、简单的装饰器 四、装饰器的语法糖 五、装饰器传参 六、带参数的装饰器 七、类装饰器 八、带参数的类装饰器 九、装饰器的顺序 总结 写在后面 前言 最近有人问我装饰器是什么,我就跟他说&#xff…

偏微分方程数值解程序设计与实现——数学基础

常用算子符号 梯度算子 R d \mathbb{R}^d Rd空间中标量函数 u ( x ) u(\bf{x}) u(x),其梯度算子定义如下: g r a d u ( x ) ∇ u ( x ) [ ∂ u ∂ x 0 ∂ u ∂ x 1 ⋮ ∂ u ∂ x d − 1 ] grad u(\mathbf{x})\nabla u(\mathbf{x}) \begin{bmatrix} …

偏微分方程的数值解(六): 偏微分方程的 pdetool 解法

偏微分方程的数值解系列博文: 偏微分方程的数值解(一):定解问题 & 差分解法 偏微分方程的数值解(二): 一维状态空间的偏微分方程的 MATLAB 解法 偏微分方程的数值解(三): 化工应用实例 ----------触煤反应装置内温度及转换率的分布 偏微分方程的数值解(四):…

微分方程数值解

一阶问题举例: 高阶问题举例 : 常微分方程数值解:向前欧拉方法之一阶问题 clc,clear,close all; a0;%初始时刻 b2*pi;%结束时刻 n100;%离散点数量 x00;%初值 h(b-a)/n;%步长 xx0 [0:n]*h;%离散点数组 funinline(sin(x)y,x,y); y01; %计算 y(…

常微分方程数值解法1

1.牛顿迭代法 多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。牛顿迭代法使用函数 的泰勒级数的前面几项来寻找方程 的根。牛顿迭代法是求方程根的重要方法之一,其最大…

差分、偏微分方程的解法

这里写目录标题 微分方程数值求解——有限差分法matlab代码差分法的运用(依旧是连续变量——>离散网格点) PDE求解思路demo1demo2 微分方程数值求解——有限差分法 差分方法又称为有限差分方法或网格法,是求偏微分方程定解问题的数值解中…

微分方程数值解法(2)——椭圆型方程的有限差分法

此处参考教材为李荣华的《微分方程数值解法》 使用工具:Matlab 1. 算法:矩形网格上5点差分格式 2. 算法 I.需要求解的函数 function [v,vx,vy,f,aa,bb,cc,dd]u2D(x,y,ft)% ft为方程编号,u1D为精确解函数u(t),注意与…

基础数学(8)——常微分方程数值解法

文章目录 期末考核方式基础知识解析解(公式法)解析解例题(使用公式法,必考)解析解的局限性 数值解数值解的基本流程 显示Euler法显示欧拉(差值理解)显示欧拉(Taylor展开理解&#xf…

微分方程数值解法(1)——常微分方程初值问题的数值解法

此处参考教材为李荣华的《微分方程数值解法》 使用工具:Matlab 1. 算法 注: 最后一行应为k4,上面为笔误 2. 算法 I.需要求解的函数 function ff1D(t,u,ft)% ft为方程编号,u1D为精确解函数u(t),注意与f1D对应右端项函数f(t,u(t))switch ftcase 1 %P10…

偏微分方程数值解法pdf_天生一对,硬核微分方程与深度学习的联姻之路

机器之心原创 作者:蒋思源 微分方程真的能结合深度神经网络?真的能用来理解深度神经网络、推导神经网络架构、构建深度生成模型?本文将从鄂维南、董彬和陈天琦等研究者的工作中,窥探微分方程与深度学习联袂前行的路径。 近日&…

椭圆型偏微分方程数值解法

一、 一维椭圆方程数值解 matlab代码&#xff1a; function chap2_fdm_elliptic_1D % 一维椭圆方程求解(常微分方程边值问题) % -u q(x)u f(x), 0<x<1, 取q(x) x, f(x) (x-1)exp(x) % u(0) 1, u(1) e; 边界条件 % 真解为 u exp(x)N 20; h 1/N; x_al…

Python小白的数学建模课-11.偏微分方程数值解法

偏微分方程可以描述各种自然和工程现象&#xff0c; 是构建科学、工程学和其他领域的数学模型主要手段。 偏微分方程主要有三类&#xff1a;椭圆方程&#xff0c;抛物方程和双曲方程。 本文采用有限差分法求解偏微分方程&#xff0c;通过案例讲解一维平流方程、一维热传导方程…