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

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

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

2、装饰器的原则:

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

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

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

(1) Python中函数即"变量'

a、变量在Python中的存储x='Tomwenxing'

y=x

[说明]:

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

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

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

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

b、函数在Python中的存储def test():

pass

[说明]:

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

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

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

因此说在Python中函数即变量

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

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

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

def 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 time

def bar():

time.sleep(3)

print('in the bar')

def test2(func):

print('新添加的功能')

return func

bar=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 time

def 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_wrapper

def 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装饰器原理与用法分析的详细内容,更多请关注php中文网其它相关文章!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

python装饰器原理-Python装饰器原理与用法分析相关推荐

  1. python利用集合的无重复性_python集合类型用法分析

    本文实例分析了python集合类型用法.分享给大家供大家参考.具体分析如下: python的集合类型和其他语言类似, 是一个无序不重复元素集,我在之前学过的其他的语言好像没有见过这个类型,基本功能包括 ...

  2. python装饰器原理-python 中的装饰器及其原理

    装饰器模式 此前的文章中我们介绍过装饰器模式: 装饰器模式中具体的 Decorator 实现类通过将对组建的请求转发给被装饰的对象,并在转发前后执行一些额外的动作来修改原有的部分行为,实现增强 Com ...

  3. python装饰器原理-python装饰器的原理和使用

    一.最简单的装饰器 装饰器是python中很基础也很实用的一个特性.通过装饰器我们可以很方便地为一些函数添加相同的功能.我们以测量函数运行时间为例来讲一讲python装饰器的运行原理. 1.使用装饰器 ...

  4. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  5. python装饰器原理-Python装饰器完全解读

    1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨--人生苦短,我用Python. 2 初步理解装 ...

  6. python装饰器原理-Python装饰器原理

    装饰器(Decorator)是面向对象设计模式的一种,这种模式的核心思想是在不改变原来核心业务逻辑代码的情况下,对函数或类对象进行额外的修饰.python中的装饰器由python解释器直接支持,其定义 ...

  7. python装饰器实例-Python装饰器原理与简单用法实例分析

    本文实例讲述了Python装饰器原理与简单用法.分享给大家供大家参考,具体如下: 今天整理装饰器,内嵌的装饰器.让装饰器带参数等多种形式,非常复杂,让人头疼不已.但是突然间发现了装饰器的奥秘,原来如此 ...

  8. python装饰器setter实现原理_python装饰器、描述符模拟源码实现

    概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人,请见谅,文章结尾贴有相关链接可以作为补充 全文分为三个部分装饰器理论知识.装饰器应用.装饰器延申 装饰理基础 ...

  9. python装饰器作用和功能_Python装饰器原理与用法分析

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

最新文章

  1. java刚工作搭建环境_Java开发环境的搭建
  2. 监护仪系统都是Linux吗,基于Linux和MiniGUI的心电监护仪设计
  3. jmeter设置代理录制请求
  4. java 正则表达式 替换字符串img标签的路径_python面试题汇总第06期-正则表达式(内附7题及答案)...
  5. myeclipse 自动生成注释
  6. Educational Codeforces Round 119 (Rated for Div. 2)
  7. 贾跃亭“站台”!乐视高调宣布回归:60余款新品发布,还将发布超级手机
  8. Win2008使用WEB方式更改工作组计算机用户帐户密码
  9. Coherence Step by Step 第一篇 入门(三)配置(翻译)
  10. 联机饥荒一直显示启动服务器,饥荒联机版启动服务器时遇到一些麻烦 | 手游网游页游攻略大全...
  11. android计算器如何保存记录,计算器历史记录怎么看
  12. 关于使用梆梆加固后,适配android5.0系统与64位机型的问题
  13. K8S高可用集群架构部署 dashborad插件部署 Nginx实现动静分离 K8S在线升级
  14. A Sample Crash Log
  15. 基本尺寸,实际尺寸,作用尺寸,极限尺寸,最大实体尺寸,最小实体尺寸
  16. 地心坐标系转地理坐标系(NED)
  17. 暑期2020“大咖说开源”之吴雪 | 开源的商业创新
  18. 三年级计算机课可以画的图有,三年级上册画画图片
  19. 电子技术——反馈系统概述
  20. 阿里云api课程学习笔记

热门文章

  1. spark RDD操作的底层实现原理
  2. uglify压缩angular控制器注意
  3. 为什么要重写hashcode( )和equals( )?
  4. hive整合sentry,impala,hue之后权限管理操作
  5. [导入]在ASP.NET 2.0中使用样式、主题和皮肤
  6. Vue学习笔记:Ref的使用
  7. cpio用法详细说明
  8. TI(德州仪器) TMS320C674x逆向分析之一
  9. C++ Primer 第三章 字符串、向量和数组
  10. Access数据库OleDbHelper