zoukankan      html  css  js  c++  java
  • python学习记录

    学习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加载顺序是由外至内,不知道正确与否

  • 相关阅读:
    调试 camera 时记录点滴
    奇偶场的合并&yuv2rgb
    拓宽视野
    Eclipse中看不到jsp的页面效果
    极品函数
    Visual C# 2005中让ComboBox控件显示出多个数据源属
    C#——如何使tableLayoutPanel 不闪烁
    ASP.NET中JSON的序列化和反序列化
    有钱慷慨的管理者,有钱吝啬的管理者,无钱思想慷慨的管理者,无钱思想吝啬的管理者都有各自的下场白
    C# WinForm开发系列 ComboBox
  • 原文地址:https://www.cnblogs.com/hh2737/p/9482941.html
Copyright © 2011-2022 走看看