老王:算了,估计你也想不出来。。。学过嵌套函数没有?

你:yes,然后呢?

老王:想实现一开始你写的america = login(america)不触发你函数的执行,只需要在这个login里面再定义一层函数,第一次调用america = login(america) 用到外层login ,这个login虽然会执行,但不会触发认证了,因为认证的所有代码被封装在login里层的新定义的函数里了,login只返回里层函数的内存地址,再执行america()时,就会调用里层函数拉。。。

你:。。。。。。什么? 什么个意思,我懵逼了。。。

老王:还是给你看代码吧。。

# -*-coding:utf-8-*-

user_status = Fales #用户登录了就把这个改成True

def login(func):
  def inner():
    _username = "alex" #假装这是DB里存的用户信息

      _password = "abc!23" #假装这是DB里存的用户信息

    global user_status

    if user_status == False:

      username = input("user:")

      password = input("password")

      if username == _username and password == _password:

        print("welcome login...")

        user_status = True

      else:

        print("wrong username or password!")

    else:

      print("用户已登陆,验证通过。。。")

    if user_status:

      func()

  return inner

def home():

  print("----首页----")

def america():

  login() #执行前加上验证

  print("----欧美专区----")

def japan():

  print("----日韩专区----")

def henan():

  login() #执行前加上验证

  print("----河南专区----")

henan = login(henan)

print(henan)

执行结果:

<function login.<locals>.inner at 0x101ea10d0>

此时你仔细着了老王写的代码,感觉老王真不是一般人呀,连这种奇淫巧技都能想出来。。。,心中默默感谢上天赐你一个大牛邻居。

你:老王呀,你这个姿势很nb呀,你独创的?

此时你媳妇噗呲笑出声来,你也不知道她笑个球。。。

老王:呵呵,这不是我独创的呀当然,这是开发中一个常用的玩法,叫语法糖,官方名称“装饰器”,其实上面的写法,还可以更简单可以把下面代码去掉。

america = login(america)  #你在这里相当于把america这个函数替换了

只在你要装饰的函数上面加上下面代码:

@login

def america():

  #login()  #执行前面加上验证

  print("----欧美专区----")

转载于:https://www.cnblogs.com/kingforn/p/10916789.html

函数-函数进阶-装饰器流程分析相关推荐

  1. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )

    文章目录 前言 一.Class.cpp#dvmDefineClass 函数分析 二.Class.cpp#findClassNoInit 函数分析 三.DexFile.cpp#dexFindClass ...

  2. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative 函数 )

    文章目录 前言 一.查询 defineClassNative 函数 二.dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineCla ...

  3. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName 函数 )

    文章目录 前言 一.DexPathList.java#findClass 类加载函数源码分析 二.DexFile.java#loadClassBinaryName 函数源码分析 前言 上一篇博客 [A ...

  4. 一木.溪桥学Python-10:函数闭包、装饰器、推导式

    一木.溪桥 在Logic Education跟Amy学Python 逻辑教育 :https://logicedu.ke.qq.com 12期:Python基础课 一木.溪桥学Python-10:函数闭 ...

  5. 18.高级函数(闭包与装饰器)

    一.闭包函数 1.闭包基础 前面我们已经学习了函数嵌套,我们再来看一个关于函数嵌套的例子. 外层函数outer_1定义了1个空列表lst,然后调用内层函数inner_1,每次调用时往内层函数传入参数1 ...

  6. python: 从函数了解到装饰器

    Table of Contents 1. 简单了解函数 1.1. 函数是什么 1.2. 函数的好处 1.3. 函数和过程的区别 1.3.1. python的函数和过程 1.3.2. common li ...

  7. python log函数_python要点-装饰器

    大家有没有碰到过这种需求,扩展公司的历史项目,对功能进行扩展?拿到历史项目看源码的时候是不是头特别大,难上加难的是还要对其进行修改!!!今天要讲的是python中的重要功能-装饰器,其对满足前述的实现 ...

  8. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  9. python基础之函数当中的装饰器

    在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

最新文章

  1. PHP添加php-java-brideg模块(ubuntu环境)
  2. vue js xlsx 读取 本地 excel
  3. 如何做相册_我是如何对2000张照片进行批量套版的
  4. DOM节点操作大全(一)
  5. Spring 2.5配置文件详解
  6. 云管理之虚拟化——虚拟化的分类
  7. Pyqt5_QPushButton
  8. 2021“数维杯”国际大学生数学建模竞赛D题思路
  9. docker 启动相关 命令
  10. Java 方法重载简单小例子
  11. itools苹果录屏大师_iTools Pro 1.8.0.4 简单易用的苹果设备 iPhone/iPad 管理工具
  12. ios6.0_6.1_苹果手机_evasion_完美越狱
  13. Flink 1.11 中的动态加载 udf jar 包
  14. 服务器宕机维护公告,服务器“宕机”的诊断方法
  15. 美国最常见英文名字排行榜(500名)
  16. ept技术_速懂X86虚拟化关键概念 - Intel EPT
  17. python用函数对列表删除_关于python:如何使用range()函数从列表中删除项目时迭代列表?...
  18. 移动端APP测试总结
  19. Python 基于sicpy求解定积分 ,不定积分以及多重积分
  20. 米转经纬度_经纬度换算米(经纬度精度换算米数)

热门文章

  1. String Modification CodeForces - 1316B(规律)
  2. easy mysql_GitHub - aleafs/easymysql: mysql client in cluster, based on node-mysql
  3. php网络相关的扩展,PHP网络操作函数汇总
  4. 安装deepin_国产系统Deepin深度不是华为笔记本也能安装
  5. 我用AI回怼美女汽车销售系列[yolo车牌识别](四)
  6. 《TCP/IP详解》笔记----第二章 链路层
  7. Python模块:日志输出—logging模块
  8. uCOS任务堆栈的深入分析(转)
  9. 统计 python_Python统计简介
  10. windows设置网卡参数