函数-函数进阶-装饰器流程分析

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

你: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制作手写签名

<!DOCTYPE html> <!-- saved from url(0056)http://hao2013.cn/canvas-special-master/brush/index.html --> <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>签名板(支持移动…

python第五次作业——陈灵院

习题1&#xff1a;读入文件pmi_days.csv&#xff0c;完成以下操作&#xff1a;1.统计质量等级对应的天数&#xff0c;例如&#xff1a;优&#xff1a;5天良&#xff1a;3天中度污染&#xff1a;2天2.找出PMI2.5的最大值和最小值&#xff0c;分别指出是哪一天。 import csv impo…

iOS 二叉树相关算法实现

什么是二叉树&#xff1f; 在计算机科学中&#xff0c;二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”&#xff0c;左子树和右子树同时也是二叉树。二叉树的子树有左右之分&#xff0c;并且次序不能任意颠倒。二叉树是递归定义的&#xff0c;所…

vux 组件库首次使用安装

1、首先通过脚手架新建一个项目&#xff0c;过程略。 创建完项目后&#xff0c;在项目里安装vux&#xff0c; 通过命令 npm install vux --save 安装 2、安装vux-loader&#xff0c; 通过命令 npm install vux-loader --save-dev 安装&#xff08;vux文档没说明&#xff09; 3、…

@Component 和 @Bean 的区别

Spring帮助我们管理Bean分为两个部分&#xff0c;一个是注册Bean&#xff0c;一个装配Bean。完成这两个动作有三种方式&#xff0c;一种是使用自动配置的方式、一种是使用JavaConfig的方式&#xff0c;一种就是使用XML配置的方式。 Compent 作用就相当于 XML配置 Component pub…

js动态验证码获取

<!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><title>短信验证码</title> </head> <body> <input type"number" id"tel" value"13303861063"> <…

Base64 算法原理,以及编码、解码【加密、解密】 介绍

Base64编码&#xff0c;是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法&#xff01;也是MIME&#xff08;多用途互联网邮件扩展&#xff0c;主要用作电子邮件标准&#xff09;中…

js通过身份证获取年龄

// 获取用户的身份证号码let identityCard this.idNum.replace(/\s/g, "");//判断长度let len identityCard.length;//设置新的变量var strBirthday "";//根据长度获取年月日if (len 18) {strBirthday identityCard.substr(6, 4) "/" identi…

爬取豆瓣top250

#xpath #第一种方法 可在开发者工具中找到标签&#xff0c;右键copy xpath&#xff0c;有时需去掉tbody标签 #第二种方法 简单学习xpath&#xff0c;自己书写&#xff0c;掌握基本语法即可&#xff0c;简单的层级关系#先将csv文件以记事本打开&#xff0c;更改编码为ASNI&…

TCP/IP,Http,Socket,XMPP的区别

网络由下往上分为 物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。 通过初步的了解&#xff0c;我知道IP协议对应于网络层&#xff0c;TCP协议对应于传输层&#xff0c;而HTTP协议对应于应用层&#xff0c; 三者从本质上来说没有可比性&#xff0c; socket则是对…

LED音乐频谱之点阵

转载请注明出处&#xff1a;http://blog.csdn.net/ruoyunliufeng/article/details/37967455 一.硬件 这里的LED选择直插的雾面LED&#xff0c;亮度可以还不失美观。注意每行要加上限流电阻。74HC138&#xff08;三八译码器&#xff09;作为列选&#xff0c;每行都连着74HC595&a…

上架相关——App Store 上架流程

说实话&#xff0c;公司要上架一个自己做的一个小项目。为了完成这个任务&#xff0c;菜鸟的我一遍找资料一遍跟着做&#xff0c;一遍修改错误一遍查找解决方案。网上的资料大部分都是2015年以前的资料&#xff0c;资料有点不够过时&#xff0c;而且步骤配图也不是很详细&#…

this.$router 的三种跳转页面方法

第一种&#xff1a; this.$router.push(需要跳转到的路径名称)此方法跳转后&#xff0c;会在历史栏目中保存路劲地址&#xff0c;当点击历史标签时可以进行访问 第二种&#xff1a; this.$router.replace(需要跳转到的路径名称)此方法跳转后&#xff0c;会在历史栏目中不保存…

cf777c

题意&#xff1a;给你一个n*m的数阵 对于一行到另一行&#xff0c;若存在一列从上到下递减&#xff0c;则称之符合题意 The first line of the input contains two positive integers n and m (1 ≤ nm ≤ 100 000) — the number of rows and the number of columns in t…

上架相关——appstore 更新app版本

注&#xff1a;此片文章是基于app已经上架&#xff0c;也就是证书都已经配置好的前提下。 首先是还是app打包 修改版本号 修改project处的pp文件 检查无误后打包打包完成后upload to app store 漫长的等待。。 上传到appstore进入iTunesConnect 选择我的app 选择对应app点…

输入框输入数字,且不能有小数点存在

基于Vue项目进行设置 <template><comp v-if"update"></comp><button click"reload()">刷新comp组件</button></template><script>import comp from /views/comp.vueexport default {name: parentComp,data() {r…

iOS开发 蓝牙技术4.0详解

前言 前端时间,同学在做项目过程中遇到关于蓝牙方面的问题,今天我就给大家进行详细的进行讲解下蓝牙在iOS开发中的具体实现.在介绍蓝牙前,大家要搞清楚什么是蓝牙? 什么是蓝牙? 随着蓝牙低功耗技术BLE&#xff08;Bluetooth Low Energy&#xff09;的发展&#xff0c;蓝牙技术…

前端面试题(五)

position的属性有哪些&#xff1f; 1、absolute生成绝对定位的元素&#xff0c;相对于值不为 static的第一个父元素进行定位。 2、fixed &#xff08;老IE不支持&#xff09;生成绝对定位的元素&#xff0c;相对于浏览器窗口进行定位。 3、relative生成相对定位的元素&#xff…

qrcode.js 二维码生成器

二维码生成 并显示&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"ko" …

SQL -- 多表查询

-- --SQL基础-->多表查询 -- /* 一、多表查询 简言之&#xff0c;根据特定的连接条件从不同的表中获取所需的数据 笛卡尔集的产生条件&#xff1a; 省略连接条件 连接条件无效 第一个表中的所有行与第二个表中的所有行相连接 二、多表查询语法&#xff1a;*/ SELECT tab…