在说装饰器前,先说一个东西,再Python里,有一个 一切皆对象,一切皆变量。

例:

 def hello(name="sunjinyao"):
return "hi " + name
print(hello())
# 输出: 'hi sunjinyao'
# 我们可以将一个函数赋值给一个变量,比如
hi = hello
# 我们这里没有在使用小括号,因为我们并不是在调用hello函数
# 而是在将它放在greet变量里头。我们尝试运行下这个
print(hi())
# 输出: 'hi sunjinyao'

装饰器:就是给其他函数添加新功能。本质也是个函数。

原则:1.不修改被装饰器函数的源代码2.不修改被装饰函数的调用方式

装饰器 = 高阶函数 + 函数嵌套 + 闭包

高阶函数:函数接收的参数是个函数名或者函数的返回是一个函数名

函数嵌套:定义的函数内还有函数,一层套一层

闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

装饰器框架:

 #例,变量名随需求更改,这里只是例子
def login(func):#参数func代表要装饰的函数
def inner(*args,**kwargs):#装饰器的参数不固定
#在这里添加需要的功能
ret = func(*args,**kwargs)
#再这里添加需要的功能
return ret
return inner #没有()没有执行

例:为TEST函数写一个装饰器,统计TEST函数的运行时间

 #为TEST函数写一个装饰器,统计TEST函数的运行时间
import time #导入时间模块
def time_1(func):#func = my_test
def inner():
start_time = time.time()
ret = func()
stop_time = time.time()
print('函数的运行时间为%s'%(stop_time-start_time))
return ret
return inner
@time_1 #必须在所装饰的函数前使用。
#@time_1 == my_test = time_1(my_test)
def my_test():
time.sleep(3)
print('test函数运行完毕')
16   return '这个是my_test的执行结果'
#my_test = time_1(my_test)
#time_1(my_test) 相当inner函数内存地址 因为time1的reture结果是inner
print(my_test())#执行了inner函数

练一练:#编写装饰器,为多个函数加上认证功能(用户密码来源于文件),要求登录一次,后续函数无需再输入密码。输入的密码为3次。

例:文件内容

abc,123
def,456
 login_status = False
def login(func):
def inner(*args,**kwargs):
global login_status
if not login_status:
count = 0
while count < 3:
user_name =input('请输入用户名:')
pass_word =input('请输入密码:')
with open('my_file',encoding='utf8') as passwd_file:
for line in passwd_file:
login_name,login_pwd = line.strip().split(',')
#用,号分割账号密码并赋值,文件末尾都是有换行的,去掉空格(strip在前)
if user_name == login_name and pass_word == login_pwd:
login_status = True
print('登录成功')
count += 3 #为了跳出while循环
ret = func(*args, **kwargs)
return ret#跳出了for循环
else:
print('登录失败,请重新登录')
count += 1
break
elif login_status:#在上面循环中,把Login_status状态改成 True之后,就不需要再次输入密码
ret = func(*args, **kwargs)
return ret
return inner
@login
def shopping_web():
return '购物界面'
@login
def home_web():
return '个人中心'
shopping_web()
home_web()
print(home_web())
print(shopping_web())
print(home_web())

Day 11:函数装饰器的更多相关文章

  1. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  2. Python档案袋(函数与函数装饰器 )

    特点:代码复用.可扩展.保持一致性 函数简单的实现,返回值的不同: #定义方法 def funx1(): pass def funx2(): return 0 def funx3(): return ...

  3. C++函数装饰器

    今天在网上看到一个python实现的函数装饰器,尝试用C++11实现了一下,最后很粗糙的完成了,代码如下. 函数装饰器:接受一个函数.将此函数进行一些装饰,成为另一个函数.新生产的函数具有原函数的功能 ...

  4. python二 总结--函数-- 装饰器

    装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码          ...

  5. Python小白学习之函数装饰器

    装饰器 2018-10-25 13:49:37 装饰器从字面意思就是用来装饰的,在函数可以理解为:在函数中,我们不想影响原来的函数功能,又想给函数添加新的功能,这时候我们就用到了装饰器. 一般函数操作 ...

  6. Python函数装饰器原理与用法详解《摘》

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

  7. python-@函数装饰器

    例如@classmethod,@staticmethod的本质就是函数装饰器,其中,classmethod和staticmethod都是python的内置函数 使用@引用已有的函数后,可用于修饰其他函 ...

  8. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  9. Python: 无参数的函数装饰器

    写带参数的函数装饰器最纠结的是需要包好多层,最外层是接收参数的函数,它返回一个接收函数的的函数.但这样有个问题是,最终包装出来的装饰器必须加()调用一下,即使没有参数也需要这样做,因为调用这个最外层函 ...

随机推荐

  1. BZOJ 2597: [Wc2007]剪刀石头布(费用流)

    传送门 解题思路 考虑全集-不能构成三元环的个数.如果三个点不能构成三元环,一定有一个点的入度为\(2\),继续扩展,如果一个点的度数为\(3\),则会失去3个三元环.对于一个点来说,它所产生的不能构 ...

  2. [bzoj2729][HNOI2012]排队 题解 (排列组合 高精)

    Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...

  3. shell txt1写入txt2,并放在txt2中指定字符串的后面

    # 先找到指定字符串aaa的行号 row=`grep -w -n "aaa" txt2 | cut -d ":" -f 1` # 将txt1中内容写入txt2中 ...

  4. 剑指offer——72圆圈中最后剩下的数字

    题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...

  5. 剑指offer——62数组种数字出现的次数

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题解: 我们想到异或运算的一个性质:任何一个数字异或它自己都等于0.也就是说,如果我们从头到尾依 ...

  6. Java8中Map的遍历方式总结

    在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map< ...

  7. shell默认参数脚本

    如果不加参数则默认执行restart函数,加stop,则执行stop函数 #!/bin/bash # version function stop(){ # stop the command } fun ...

  8. ArcGis EsriAddin加载项的安装路径与程序启动路径

      安装路径: 在C:\Users\用户名\Documents\ArcGIS\AddIns\Desktop版本号\{…………一组GUID…………}这样的路径下.  例:C:\Users\Adminis ...

  9. 轻量级的惰性控件——ViewStub

    在开发过程中,有时候,需要这样一种控件,正常情况下不可见,不占用任何布局空间,只在某种特定情况下显示,这种情况下,我们使用一个普通的View,利用设置setVisibility(View.GONE)自 ...

  10. Spring对junit的整合

    Spring对junit的整合 package cn.mepu.service; import cn.mepu.config.SpringConfiguration; import cn.mepu.d ...