这篇文章主要介绍了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中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局 ...

  2. python装饰器作用噜咕_python 装饰器的实际作用有哪些

    终于知道python的装饰器是怎么回事,那在工作中,到底能干吗用呢? 尤其对我这个只会写写脚本又不做python开发的小测试/手动无辜脸. 先说结论,肯定是有用处滴. 一.自动化测试中使用 就拿写的自 ...

  3. python装饰器作用噜咕_Python装饰器是什么?有什么价值?

    装饰器就是把一个猴子,塞入炼丹炉,然后就出来一个还是会吃桃子,但有火眼金睛的猴子:还是原来的猴子,但多了特效技能. 下面我们以下4个方面介绍Python的装饰器:什么是装饰器? 为什么Python要引 ...

  4. python类加载机制_PHP面向对象自动加载机制原理与用法分析

    本文实例讲述了PHP面向对象自动加载机制原理与用法.分享给大家供大家参考,具体如下: 在学习PHP的面向对象的时候,会知道很多"语法糖",也就是魔术方法.有一个加自动加载的魔术方法 ...

  5. python中int函数的功能_python中int函数的用法

    int(x)函数(实际上是一个类,初学者可以将其当成一个函数)中的参数x可以是一个数值,也可以是一个字符串. 如果x是一个数值,那么这个函数就是一个向0取整的函数 ,比如 如果x是一个字符串,intx ...

  6. python中reversed是什么意思_Python内置函数reversed()用法分析

    这篇文章主要介绍了Python内置函数reversed()用法,结合实例形式分析了reversed()函数的功能及针对序列元素相关操作技巧与使用注意事项,需要的朋友可以参考下 reversed()函数 ...

  7. python中merge函数怎么用_Python Merge函数原理及用法解析

    Merge函数的用法 简单来说Merge函数相当于Excel中的vlookup函数.当我们对2个表进行数据合并的时候需要通过指定两个表中相同的列作为key,然后通过key匹配到其中要合并在一起的val ...

  8. python装饰器原理-Python装饰器原理与用法分析

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

  9. 小哥哥你有98K吗?利用Python制作一款多功能变声器!

    前言 好吧,关于这句小哥哥你有98K吗?出自别人口中经常说的玩笑话,我也略懂一些游戏嘛.不过不常玩,废话不多说,开始咱们今天的教程,非常简单! 利用Python制作一款多功能变声器! 咱们首先登陆百度 ...

最新文章

  1. 业余时间用哪里,哪里就有发展的可能
  2. android 自动化web,如何在android上使用selenium或appium自动化Chrome浏览器?
  3. html中单双引号嵌套,[转]详细讲述asp中单引号与双引号(即引号多重嵌套)的用法...
  4. 如何构建识别图像中字符的自动程序?一文解读OCR与HTR
  5. 原码的一位乘法和补码的一位乘法对比
  6. php格式化金额函数分享
  7. ssh(Spring+Spring mvc+hibernate)——EmpServiceImpl.java
  8. linux可用机场客户端,Linux系统可用的6款Bittorrent客户端
  9. GC算法-引用计数法
  10. 【BZOJ2157】旅游,树链剖分练习
  11. 游戏英雄联盟高清壁纸,人物角色都包括
  12. 开发者必备Mysql命令
  13. Git使用总结-so easy
  14. 基于C#和DGAL包实现栅格影像的读取和显示
  15. 控制终端, 用户登录、mail、hostname、随机数 (笔记)
  16. 专题三:MATLAB程序流程控制
  17. 【TSP】基于matlab遗传算法求解30城市旅行商问题【含Matlab源码 135期】
  18. 广州自由自在进口食品进入寻常百姓家
  19. python数学建模基础教程_Python 数学建模极简入门(一)
  20. 视频中场的概念(1080I和1080P)和BT601/656/709/1120/2020/2077

热门文章

  1. 成为Java流专家–第2部分:中级操作
  2. java百里香_百里香Spring测试的意见
  3. 使用Spring Boot和Kubernetes构建微服务架构
  4. java rmi 使用管道_使用Java RMI时要记住的两件事
  5. 带有Oracle Digital Assistant和Fn Project的会话式UI
  6. 尽可能地做到无服务器,但不止于此
  7. 使用Spring Data Cassandra缓存的预备语句
  8. [MEGA DEAL]完整的Java捆绑包(96%折扣)
  9. Java 10将如何改变您的编码方式
  10. aws s3 命令行_通过命令行界面使用AWS ElasticMapReduce