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

Python装饰器

时间:2023-06-24 22:45:50浏览次数:33  
标签:__ return 函数 Python add 原函数 func 装饰

简单装饰器

1.装饰器的本质就是一个函数,在不改变原函数功能的情况下,动态为函数增加功能

def info(func):                                                    --本质就是一个函数
print(f'调用函数 -> {func.__name__}')
return func --为函数增加一个打印日志的功能:显示调用的函数名称

----原函数--------
@info                                -------------加上装饰器
def add(a,b):
print(a+b)
return a+b
@info -------------加上装饰器
def sub(a,b):
print(a-b)
return a-b

if __name__=='__main__':
add(4,6)
sub(5,2)

--------结果---------

调用函数 -> add                  -----调用加法函数的时候打印了一个日志:调用了add函数
调用函数 -> sub                  -----调用减法法函数的时候打印了一个日志:调用了sub函数
10                                       -----同时没有改变原函数的功能,实现了加法运算
3                                         -----同时没有改变原函数的功能,实现了减法运算

---------------------------------------------------------------------------------------------------------------------------------------------

普通装饰器

在装饰器里使用一个和原函数有相同功能的新函数替换原函数,目的是拿到原函数的参数,对参数进行处理

新函数不要写死,否则无法动态增加功能,比如下边的例子

新函数my_add新函数功能写死了,只能做加法,如果是减法调用了,本来是要做减法的,结果却是做出来了加法,这就出bug了

调用了add的参数,然后参数在my_add里运行了,返回了my_add的运行结果

def my_add(a,b):

    print(f'调用my_add参数为 {a},{b}')
return a+b
def deco(func):
return my_add
@deco
def add(a,b):
return a+b
@deco
def sub(a,b):
return a-b

if __name__=='__main__':
add=sub(11,2)
print(add)

------------------------------------------------------------------------------

调用my_add参数为 11,2
13

普通装饰器需求:拿到原函数的参数,返回值 进行一些处理

例如 打印调用函数时的实际参数,参数检查,返回值格式化等

实现方法  新建一个相同功能的函数替换原函数  

怎样快速创建一个和原函数功能相同的新函数呢,就是给原函数套壳

def deco(func):
def new_func(a,b): ---------在装饰器里新建新函数

print(f'调用 {func.__name__} 参数为 {a},{b}')
        return func(a,b)                ---------新函数直接调用原函数就行
    return new_func                     ------对原函数进行套壳快速构建一个具有相同功能的新函数

@deco
def add(a,b):
return a+b
@deco
def sub(a,b):
return a-b

# if __name__=='__main__':
# add=sub(11,2)
print(add(11,100))

-------------------------------------------------------------------------

调用 add 参数为 11,100
111

-------------------------------------------------------------------------------------

上边的只能传两个参数,参数超过两个了就不行了

任意参数的新函数,加上*args,**kwargs可以传任意个数参数,

def decorator(func):                  ----------------装饰器:输入一个函数 返回一个(同功能)函数  装饰器的名称可以随意起

    def new_func(*args,**kwargs):                --------套壳函数,原函数同功能的函数   新函数的名称可以随意起
print(f'调用 {func.__name__} 参数为 {args},{kwargs}')
return func(*args,**kwargs)
return new_func
@decorator
def add(a,b):
return a+b
@decorator
def sub(a,b):
return a-b
@decorator
def sys(a,b,c):
return a*b*c

# if __name__=='__main__':
# add=sub(11,2)
print(sys(11,100,12))

-----------------------------------------------------------------------------------------------

调用 sys 参数为 (11, 100, 12),{}
13200

 

标签:__,return,函数,Python,add,原函数,func,装饰
From: https://www.cnblogs.com/Lcong/p/17501708.html

相关文章

  • 二分图最优匹配——Python实现
    二分图是一种特殊的图结构,它在经济与管理中具有重要的作用,譬如二分图在市场与供应链管理中发挥着关键作用,在供应链中二分图可以用来描述供应商与分销商之间的关系,帮助确定最佳的供应商-分销商匹配方案。通过建立供应商与分销商之间的连接,可以降低成本、提高效率,并确保产品能够及时......
  • 在PyInstaller中打包Python代码
    在PyInstaller中打包Python代码在实际开发中,我们经常需要将Python代码打包成可独立运行的可执行文件,以便更方便地分享和部署。PyInstaller是一个常用的Python打包工具,可以将Python脚本打包成单个可执行文件。以下是如何使用PyInstaller打包Python代码的步骤:安装PyInstaller,使用......
  • python中dict.copy()用法
    浅拷贝和深拷贝浅拷贝:只会对最表层的进行拷贝,也就是相当于二者共有深拷贝:会申请一块新的内存进行存储,相当于自己独占对于dict的copy来说,是对最表层的键值对进行了深拷贝,举例来说:a={'one':1,'two':2,'three':[1,2,3]}b=a.copy()b从a拷贝过来的是{'one':1,'two':......
  • 6-18|Python画字母H
    在使用Python画字母H时,最基本的步骤就是先定义开始和结束的位置。下面是示例代码:importturtlet=turtle.Turtle()t.penup()t.goto(-50,0)t.pendown()t.goto(50,0)t.penup()t.goto(0,0)t.pendown()t.goto(0,100)turtle.done()上述代码创建了一个名为t的turtle......
  • Python框架Flask
    Flask安装pipinstallFlask项目配置debug模式Host端口号fromflaskimportFlask,requestapp=Flask(__name__)#http://192.168.31.118:5001/@app.route('/')defhello_world():#putapplication'scodeherereturn'HelloWorld12223!&......
  • python入门(二):python安装和pycharm安装
    Python的安装原文|大纲|首页Python是一种高级、通用、解释型的编程语言。它具有简洁明了的语法和强大的功能,因此成为了许多人学习编程的首选语言。1.下载Python首先,你需要从Python官方网站(https://www.python.org)下载最新版本的Python。在网站的首页上,你可以找到一个......
  • python入门(四):运算符和表达式
    Python运算符和表达式指南原文|大纲|首页在Python中,运算符用于执行各种操作,如算术运算、比较运算、逻辑运算等。表达式是由变量、常量和运算符组成的代码片段。了解Python的运算符和表达式对于编写有效的代码至关重要。算术运算符算术运算符用于执行基本的算术操作,如加......
  • python入门(三):变量和数据类型
    变量和数据类型指南原文|大纲|首页在Python中,变量用于存储数据,并且每个变量都有一个特定的数据类型。了解变量和数据类型是学习Python编程的基础。变量变量是用来存储数据的容器。在Python中,你可以通过给变量赋值来创建一个变量。变量的命名规则如下:变量名只能包含字......
  • python入门(七):函数和模块
    Python函数和模块指南原文|大纲|首页在Python中,函数和模块用于组织和重用代码。函数允许将一段代码封装为可执行的块,并在需要时调用,而模块则允许将相关的函数和变量组织在一起。了解Python的函数和模块对于编写可维护和可扩展的代码至关重要。函数(Function)函数是一个带......
  • python入门(六):数据结构和容器
    Python数据结构和容器指南原文|大纲|首页在Python中,数据结构和容器用于存储和组织数据。它们提供了不同的方式来操作和访问数据,以满足不同的需求。了解Python的数据结构和容器对于编写高效和灵活的代码至关重要。列表(List)列表是Python中最常用的数据结构之一。它是一个......