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

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

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

 

posted on 2019-05-24 10:56  kingforn  阅读(147)  评论(0编辑  收藏  举报