python(装饰器)
要了解装饰器,先要了解以下几点
1.函数等价于变量
函数在内存中的存储和变量是类似的
hello就相当于一个变量,起始地址是 “0x000002578215c1e0”,从这个地址开始后面的一段内存空间,存放hello这个函数的内容
2.高阶函数
一个函数可以被当作是另一个函数的参数传入,返回值也可以是一个函数
3.函数嵌套
形如:
def func1(): def func2(): pass
装饰器:
装饰器应该满足:
1.不改变被装饰函数的源代码
2.不改变原函数的调用方式
3.为原来的函数添加新的功能
example:
如果没有装饰器,函数调用结果应该为 hello ,加上装饰器后函数的调用结果变了,但是调用函数的方式以及函数的源代码都为发生改变。
@deco 这句话等价于 hello = deco(hello) hello被作为参数传给了deco参数,并且把hello的地址给了func,而返回值又将add_name函数的地址给了 hello ,所以调用 hello()
其实执行的是add_name函数的内容,add_name执行到 func()语句时,会去执行原来的 hello 函数的内容,因为一开始hello就把地址给了func。有点混乱,画个图吧!
简单来说装饰器其实就是一个函数,而这个函数会在内部嵌套一层或多层函数,内层嵌套的函数会再调用原来的函数基础上加上一些新的功能。
这个装饰器装饰的函数是没有参数的,下面看看有参数的函数的装饰器
example:
虽然实现了装饰器的功能但是,原来的 hello 被handsome给覆盖了,这让人有点不舒服,可能时强迫症吧
可以用 wraps 来装饰内层函数来解决这个问题
wraps 的作用时保留原来函数的属性。
装饰器实例---authentication
有一个登陆系统,管理员和用户使用不同的登陆接口。用装饰器实现。
1 from functools import wraps 2 3 passwd='passwd' 4 5 def o_deco(level): #level 判断时管理员还是用户 6 def deco(func): 7 @wraps(func) #保留函数原属性 8 def wrapper(name): 9 if level=='admin': 10 password = input("please ,input your password:") 11 if password == passwd: 12 func(name) 13 else: 14 print("incorrect password!") 15 else: 16 password = input("please ,input your password:") 17 if password == passwd: 18 func(name) 19 else: 20 print("incorrect password!") 21 return wrapper 22 return deco 23 @o_deco(level='admin') #等价与 @deco ,只是传入了一个level参数 24 def login_admin(name): 25 print("welcome,admin...%s" % name) 26 @o_deco(level='user') 27 def login_user(name): 28 print("welcome,user...%s" % name) 29 30 login_admin('binary')
上一篇: 尔朱英娥:南北朝最传奇女子,先后嫁给三个人都是皇帝
下一篇: 文件描述符与重定向
推荐阅读
-
IBM X3650 M3服务器安装windows 2003的方法
-
HP Gen8 服务器安装2008 R2 帮助手册
-
IBM X System ServerGuide 8.41 服务器 系统安装 引导盘图文教程
-
服务器组装技术之LSI RAID配置硬盘热备图解
-
dell服务器硬盘的状态变成外来(foreign)的解决方法
-
无线鼠标失灵只有插拔接收器才能用该怎么办?
-
Core i7-8700K值得买吗?Intel Core i7-8700K/i5-8600K八代处理器首发全面评测
-
高手指点:其实显示器驱动也是很重要的
-
如何去掉电影片头片尾?狸窝全能视频转换器将电影片头片尾去除的方法介绍
-
酷睿i3 2120处理器是几核的