装饰器

作者: 快去学习不然怎么去看aimer | 来源:发表于2019-09-25 19:21 被阅读0次

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

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

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()

相关文章

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

网友评论

      本文标题:装饰器

      本文链接:https://www.haomeiwen.com/subject/fsbuectx.html