装饰器

2019-09-25  本文已影响0人  快去学习不然怎么去看aimer

作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关

闭包概念:
外部函数包了一个内部函数,内部函数用的外部函数的变量,并且返回一个包含了外部作用域而非全局作用域的变量,我们就称这个内部函数为闭包。
情况一:

def outer(f):
    def inner():
        print(f)
    return inner

really_inner = outer(10)

really_inner()
内部函数用的是外部函数的变量f

情况二:

n=10
def outer(arg):
      def inner():
            print(arg)
      return inner()
f=outer(n)
print(f)
将n的值传给arg,里面函数用的是arg这个变量,不是n

简单理解装饰器

就像一个自己定义的模块,里面定义某几种功能,当某个函数想要实现这些功能时,在函数前@装饰器里的外部函数名称,就会参数传递(这个参数有时候会是某个函数)

def n():
    print("welcome")
def outer(arg):
    def inner():
        print("*"*20)
        arg()
        print("*"*20)
    return inner
n = outer(n)
n()
image.png

装饰器的一般模板

def auth(func):
    def wrapper(*args, **kwargs):
        # 写需要增加的功能的代码
        r = func(*args, **kwargs)
        return r
    return wrapper

例子

# 被装饰的函数
def echo(msg):
    print(f"千锋教育{msg}欢迎您!")

# 装饰器
def outer(arg):
    def inner(*args,**kwargs):
        print("*" * 20)
        arg(*args,**kwargs)
        print("*" * 20)

    return inner
echo = outer(echo)
echo('云计算')

@outer
def show(g):
   print(f"{g} is good")

********************
千锋教育云计算欢迎您!
********************

装饰器最常见用途,验证用户登录

user_info = {'name':'wgy','pwd':'123'}
user_list=[]
def auth_login(func):
      def wrapper(*args,**kwargs):
          inp_user = input("用户名").strip()
          inp_pwd = input("密码").strip()
          user = False
          if inp_user == user_info['name'] and inp_pwd == user_info['pwd']:
              user_list.append(inp_user)
              user=user_info['name']
          elif inp_user in user_list and inp_pwd in user_list:
               func(*args,**kwargs)
          if user :
                func(*args,**kwargs)   
          else:
                print("error")
      return wrapper
def shouye():
    print("this is shouye")
@auth_login
def user_center():
    print(user_list)
    print("this is user center")
def exit():
    import os
    os._exit(0)
def main():
    while 1:
        print("""
        1.go to shouye
        2.go to user center
        3.login
        q.exit
        """)
        choice = input(">>please input your choice:")
        if choice =='1':
            shouye()
        elif choice=='3':
            user_center()
        elif choice=='2':
            if len(user_list)==1:
                print("this is user center")
            else:
                print("please login first!")
        elif choice=='q':
            exit()
if __name__=="__main__":
    main()
上一篇 下一篇

猜你喜欢

热点阅读