Python装饰器原理与用法分析

这篇文章主要介绍了python装饰器原理与用法,结合实例形式分析了python装饰器的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下

本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考,具体如下:

1、装饰器的本质是函数,主要用来装饰其他函数,也就是为其他函数添加附加功能

2、装饰器的原则:

(1) 装饰器不能修改被装饰的函数的源代码

立即学习“Python免费学习笔记(深入)”;

(2) 装饰器不能修改被装饰的函数的调用方式

3、实现装饰器的知识储备

(1) Python中函数即‘变量’

a、变量在Python中的存储

x='Tomwenxing'y=x

登录后复制

[说明]:

当Python解释器遇到语句x=’Tomwenxing’时,它主要完成了两样工作:

  1.在内存中开辟了一片空间用来存储字符串‘Tomwenxing’

  2.在内存从创建了一个名为x的变量,并用它指向字符串‘Tomwenxing’所占据的内存空间(可以理解为房间和房间号的关系)

Python装饰器原理与用法分析

而语句y=x意为将变量x对字符串的引用赋值给变量y,即在内存中创建一个变量y,并使其指向变量x所指向的内存空间

Python装饰器原理与用法分析

b、函数在Python中的存储

def test():  pass

登录后复制

[说明]:

在Python中,函数的存储和变量相似,以上面的函数为例,Python解释其主要做两件事:

  1.在内存中开辟一个内存空间,用来存储函数代码的字符串(本例中代码只有一句:pass)

  2.在内存中创建一个变量test,用来指向存储函数代码字符串的内存空间(相当于test=‘函数体’)

Python装饰器原理与用法分析

因此说在Python中函数即变量

(2) 高阶函数(下面两个条件满足任何一个即为高阶函数)

a、把一个函数名当做实参传递给另外一个函数

[对装饰器的影响]:达到“在不修改被装饰函数源代码的情况下为其添加功能”的效果

import timedef bar():  time.sleep(2)  print('in the bar')def test(func):  start_time=time.time()  func()  stop_time=time.time()  print('函数的运行时间为:',stop_time-start_time)test(bar)

登录后复制

运行结果:

in the bar函数的运行时间为: 2.0021145343780518

b、返回值中包含函数名

[对装饰器的影响]:达到“不改变函数的调用方式“的效果

import timedef bar():  time.sleep(3)  print('in the bar')def test2(func):  print('新添加的功能')  return funcbar=test2(bar)bar()

登录后复制

运行结果:

新添加的功能
in the bar

(3) 嵌套函数:在一个函数体内用def去声明一个新的函数(不是调用)

def foo():  print('in the foo')  def bar(): #声明一个新的函数,而不是调用函数    print('in the bar')  bar()foo()

登录后复制

运行结果:

in the foo
in the bar

4、装饰器的语法:高阶函数+嵌套函数=》装饰器 (下面的例子可以用pycharm的调试器调试一下,看看代码的运行顺序)

import timedef timer(func):  def deco(*args,**kwargs):#使用了不定参数    start_time=time.time()    res=func(*args,**kwargs) #运行函数    stop_time=time.time()    print('运行时间:',stop_time-start_time)    return res # 若无返回值,则返回None  return deco@timer #等价于test1=timer(test1)=deco,即test1()=deco()def test1():  time.sleep(3)  print('in the test1')@timer #等价于test2=timer(test2)=deco,即test2(name)=deco(name)def test2(name):  time.sleep(3)  print('in the test2',name)test1()print('-------------分界线------------------------')test2('Tomwenxing')

登录后复制

运行结果:

in the test1
运行时间: 3.0001718997955322
————-分界线————————
in the test2 Tomwenxing
运行时间: 3.000171422958374

5、带参数的装饰器

# -*- coding:utf-8 -*-user,passwd='Tomwenxing','123'#如装饰器带参数,一般是三层嵌套def auth(auth_type): #第一层的参数是装饰器的参数  def outer_wrapper(func):#第二层的参数是装饰器要装饰的目标函数    def wrapper(*args,**kwargs):#第三次的参数是目标函数的参数      if auth_type=='local':        username = input('Username:').strip()        password = input('Password:').strip()        if user == username and passwd == password:          print('用户Tomwenxing已经成功登录!')          res = func(*args, **kwargs) #运行目标函数          return res        else:          exit('用户名或密码有错误')      elif auth_type=='ldap':        print('暂不支持这种登录方式!')    return wrapper  return outer_wrapperdef index():  print('欢迎来到index页面')@auth(auth_type='local') #home=wrapper()def home(name):  print('%s,欢迎来到home页面' %name)  return 'This is home page'@auth(auth_type='ldap')def bbs():  print('欢迎来到bbs页面 ')index()print('----------------------分界线-------------------')print('函数的返回值为:',home('wenxing'))print('----------------------分界线-------------------')bbs()

登录后复制

运行结果:

欢迎来到index页面
———————-分界线——————-
Username:Tomwenxing
Password:123
用户Tomwenxing已经成功登录!
wenxing,欢迎来到home页面
函数的返回值为: This is home page
———————-分界线——————-
暂不支持这种登录方式!

相关推荐:

使用python装饰器计算函数运行时间

Python迭代器定义与简单用法分析

以上就是Python装饰器原理与用法分析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2262850.html

(0)
上一篇 2025年2月27日 07:13:37
下一篇 2025年2月18日 01:15:39

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 零基础学哪种编程语言

    对于初学者,Python 和 JavaScript 以其简单的语法脱颖而出,适合初学。实践应用方面,C++ 和 Java 分别在游戏开发和企业级应用程序中广泛使用。市场需求方面,Python 在数据科学中需求旺盛,而 JavaScript …

    2025年2月27日
    200
  • 编程在电脑哪里打开

    编程可以通过以下步骤在电脑上打开:打开文本编辑器或集成开发环境 (IDE)。创建新文件。输入所需的编程代码。保存文件(通常以 .py、.java 或 .cpp 等扩展名)。在 IDE 中打开或导入代码文件。 编程如何在电脑上打开 打开方法:…

    2025年2月27日
    200
  • Python中pillow知识点学习

    本文给大家通过一篇python中pillow知识点学习的笔记内容让大家对pillow有一个学习方向的有一个认识,有兴趣的朋友学习下。 此系列意在记录于一些有趣的程序及对其的总结。 问题来源: https://github.com/Yixia…

    编程技术 2025年2月27日
    200
  • 计算机编程语言有多少种

    目前已知有数百种计算机编程语言,并仍在不断发展。根据不同的标准,编程语言可分为范式(如结构化、面向对象)、用途(如通用、特定领域)和编写方式(如编译型、解释型)。最流行的编程语言包括 Python、C、Java、C++、C#、Visual …

    2025年2月27日
    200
  • Python生成器定义与简单用法实例分析

    这篇文章主要介绍了python生成器定义与简单用法,结合实例形式较为详细的分析了python生成器的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python生成器定义与简单用法。分享给大家供大家参考,具体如下…

    编程技术 2025年2月27日
    200
  • 计算机语言有哪些各有什么特点

    计算机语言是人机交互的媒介,分为低级语言(二进制、汇编)和高级语言(C/C++、Java、Python、JavaScript、Swift)。选择语言时需考虑任务要求、性能、开发者能力和平台兼容性。 计算机语言:类型和特点 什么是计算机语言?…

    2025年2月27日
    200
  • python 实现在txt指定行追加文本的方法

    这篇文章主要介绍了关于python 实现在txt指定行追加文本的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 如下所示: fp = file(‘data.txt’)lines = []for line in fp:  …

    编程技术 2025年2月27日
    200
  • Python 实现在文件中的每一行添加一个逗号

    这篇文章主要介绍了关于python 实现在文件中的每一行添加一个逗号,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 步骤1:读取每行(每行的类型是str) 步骤2:对每行列表化 步骤3:弹出每行的/n两个字符 步骤4:追加,…

    编程技术 2025年2月27日
    200
  • 电脑编程用什么软件比较好

    选择编程软件应考虑编程语言、平台、功能和价格。推荐的软件包括:IDE:Visual Studio Code、PyCharm、IntelliJ IDEA代码编辑器:Sublime Text、Atom、Notepad++文本编辑器:Vi、Ema…

    2025年2月27日
    200
  • python 把文件中的每一行以数组的元素放入数组中的方法

    这篇文章主要介绍了关于python 把文件中的每一行以数组的元素放入数组中的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 有时候需要把文件中的数据放入到数组中,这里提供了一种方法,可以根据文件结尾的标记进行数据拆分,然…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论