码迷,mamicode.com
首页 > 编程语言 > 详细

python(装饰器)

时间:2019-10-27 11:01:23      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:接口   系统   问题   pass   空间   有一个   height   def   please   

要了解装饰器,先要了解以下几点

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)

 

python(装饰器)

标签:接口   系统   问题   pass   空间   有一个   height   def   please   

原文地址:https://www.cnblogs.com/planBinary/p/11728539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!