学习python中·······

今天写了个装饰器用来登录用,用户名和密码是存在文件里的,涉及到了装饰器和带参数的装饰器

文件里的内容如下

{"liming": 123456}
{"zhangsan": 1234545}

类似于字典格式

装饰器代码如下

def login(t="false"):
def if_login(func):
if t == "false":
username = str(input("Please input your name: "))
password = input("Please input your password: ")
userdic = {}
with open("test.txt", 'r') as f:
for i in f.readlines():
x = eval(i)
userdic.update(x)
if username in userdic:
if password == str(userdic[username]):
print("Welcom....")
return func
else:
print("password or username error")
else:
print("password or username error1")
else:
return func
return if_login

红色代码部分思路是这样的,先定义一个空字典,然后打开文本文件,然后遍历这个文本文件,并把每次遍历出来的字符串转化为字典,并且更新到原来的空字典中,这样我们就有一个所有用户名和密码的字典了

这样的缺点是,如果是用户名和密码多的话,会浪费内存,毕竟都要加载到字典中,剩下就是判断了,就没那么麻烦了。

另外需要注意的是 3个 return,第一个return 是如果标识符是false的话需要用户登录,登陆成功后返回func也就是传入的函数,第二个return如果传入的标识符参数不是false的话直接返回func,这样用户就不用登录了,

最后一个return 是login函数的返回值,这里如果不写的话,调用后会报错,报错如下

@login("true")
def web():
print("this is a index page") 以下是报错信息
Traceback (most recent call last):
File "F:/xuexi/files.py", line 45, in <module>
@login("true")
TypeError: 'NoneType' object is not callable

因为login如果没返回值,那么就是NoneType,那么这个类型是不不可调用的,会报错,

最开始时候没写,导致出错了,还是学艺不精,需要多学习。

再来看下带参数装饰器的执行过程

@login("true")
def web():
print("this is a index page")

以上代码等价于下面的

x = login("true")
t = x(web)
t()

以上内容等价于

x 得到的返回值是if_login函数

t 得到的返回值是if_login(web)函数

最后t()得到返回值是login的返回值,感觉还是有点问题

login("true")(web)()

先传入true参数,得到if_login函数,给if_login函数传入web参数,得到if_login函数执行后的返回值,最后得到login函数的返回值

login函数得到的return结果是if_login函数整体执行结果。

if_login函数得到的return结果web函数。

if_login函数整体结果是判断内容加retrun的web函数

由此可以猜想,嵌套函数是由最内层到最外层一层层把结果返回直到最外层,但是代码执行时候,return加载顺序是由外至内,不知道正确与否

python学习记录的更多相关文章

  1. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  2. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  3. Python学习记录day8

    目录 Python学习记录day8 1. 静态方法 2. 类方法 3. 属性方法 4. 类的特殊成员方法 4.1 __doc__表示类的描述信息 4.2 __module__ 和 __class__ ...

  4. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  5. Python学习记录:括号配对检测问题

    Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...

  6. 实验楼Python学习记录_挑战字符串操作

    自我学习记录 Python3 挑战实验 -- 字符串操作 目标 在/home/shiyanlou/Code创建一个 名为 FindDigits.py 的Python 脚本,请读取一串字符串并且把其中所 ...

  7. 我的Python学习记录

    Python日期时间处理:time模块.datetime模块 Python提供了两个标准日期时间处理模块:--time.datetime模块. 那么,这两个模块的功能有什么相同和共同之处呢? 一般来说 ...

  8. Python 学习记录

    记录一些 学习python 的过程 -------------------------------------- 1. 初始学习 @2013年10月6日 今天开始学习python 了 遇到好多困难但是 ...

  9. python学习记录_IPython基础,Tab自动完成,内省,%run命令_

        这是我第一次写博客,之前也有很多想法,想把自己所接触的,以文本的形式储存,总是没有及时行动.此次下定决心,想把自己所学,所遇到的问题做个记录共享给诸位,与此同时自己作为备忘,感谢各位访问我的博 ...

  10. Python学习记录----数据定义

    摘要: 描述Python中数据定义格式,需要注意的东东. 一 数据声明 Python木有一般语言的具体数据类型,像char,int,string这些通通木有.这有点像javascript,但又不同,j ...

随机推荐

  1. 关于第一次在IED(MyEclipse)部署Maven时,pom.xml头部报这样的错---org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)

    rg.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache ...

  2. [BUG]读配置文件中文, 查询不到数据库

    配置文件编码, 要和数据库编码一致

  3. 第一篇,java学习之旅

    在java的这座殿堂中,我才刚刚推开了大门,就像是在岔路口找到了一条,走向前进java大门的路. 下面是一些java算法的问题 第一题: package project.model; import j ...

  4. NAS (Network Attached Storage)

    当电脑硬盘容量满了,多数使用者第一个想法就是买一块几TB的硬盘来扩充,如果是笔电的使用者,第一个想到的是买一个外接式硬盘来备份资料,这样的想法并没有错,那是当你还不知道有「NAS」这个好用的东西,才会 ...

  5. SpringMVC + MyBatis分库分表方案

    mybatis作为流行的ORM框架,项目实际使用过程中可能会遇到分库分表的场景.mybatis在分表,甚至是同主机下的分库都可以说是完美支持的,只需要将表名或者库名作为动态参数组装sql就能够完成.但 ...

  6. Go语言for循环语句

    for循环语句解释与使用 首先我们定义sum:=0 格式:for i:=1;i<=100;i++{ sum+=i } for 循环100次,首先执行i=1,然后判断i<100,再执行sum ...

  7. RabbitMQ python模块pika生产者消费者轮询模型。

    完整代码如下: 生产者,producer import pika connection = pika.BlockingConnection( pika.ConnectionParameters('lo ...

  8. 转"container of()函数简介"链接地址

    https://blog.csdn.net/s2603898260/article/details/79371024 提示关键字: 指针0的使用 typeof的使用

  9. 为什么浏览器User-agent总是有Mozilla字样

    你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样?Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ( ...

  10. confluence6.3.1部署+数据迁移

    目录: 环境准备 搭建方法 数据迁移 搭建过程中的bug 1,confluence部署 1.1,环境准备 Java:jdk1.8 mysql: 数据库编码规则选择utf8 -- UTF-8 Unico ...