zoukankan      html  css  js  c++  java
  • 函数-函数进阶-装饰器流程分析

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

    你: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("----欧美专区----")

  • 相关阅读:
    控制asp.net 中文本框中只能输入数字
    数据导出到Excel的方法
    NET 2.0中泛型
    DateTime类常用技巧
    CodeSmith是一个基于模板的代码生成器
    WCF学习第一天
    asp.net mvc中DropDownList,CheckBox,RadioButton
    wcf实现可靠性传输
    cookie
    asp.net mvc3 异步Controller
  • 原文地址:https://www.cnblogs.com/kingforn/p/10916789.html
Copyright © 2011-2022 走看看