• python装饰器的学习笔记


    此博文是我对装饰器的一些理解,如果有错误欢迎及时留言,我会第一时间向大家学习。

    一、什么是装饰器

    1、从字面意义来看:

    是用来给函数装饰打扮的函数

    2、理论上可以理解为:

    (1)、不改变函数的运行方式

    (2)、不改变函数体内容的情况下给函数添加新的功能

    3、装饰器的结构:

    装饰器=高阶函数+函数嵌套+闭包

    二、装饰器的种类

    下面就利用两个例子来实现一下带参装饰器和不带参装饰器使用。

    1、不带参数的装饰器

     1 user ={'name':'test','passwd':'123'}
     2 
     3 user_status = {'name':None,'login':False}
     4 
     5 def auth_func(func):
     6     def warper(*args,**kwargs):
     7         if user_status['name'] and user_status['login']:
     8             res = func(*args,**kwargs)
     9             return res
    10         name = input("username: ")
    11         passwd = input("password: ")
    12         if user['name'] == name and user['passwd'] == passwd:
    13             user_status['name'] = name
    14             user_status['login'] = True
    15             res = func(*args,**kwargs)
    16             return res
    17         else:
    18             print("用户名或密码错误")
    19     return warper
    20 
    21 @auth_func
    22 def index(name):
    23     print("欢迎%s 来到主页" % name)
    24 
    25 @auth_func
    26 def home(name):
    27     print("我在home下")
    28 
    29 index("test")
    30 home('test')
    31 
    32 #输出
    33 username: test
    34 password: 123
    35 欢迎test 来到主页
    36 我在home下

    2、带参数的装饰器

     1 auth_user_dict ={'username':None,'password':False}
     2 
     3 def load_fileBD():
     4     with open("userDB",'r') as f:
     5         return f.read()
     6 
     7 
     8 def auth(auth_type = 'file'):
     9     def auth_func(func):
    10         def wraper(*args,**kwargs):
    11             if auth_type == 'file':
    12                 fild_data = load_fileBD()
    13                 fild_data = eval(fild_data)
    14                 if auth_user_dict['username'] and auth_user_dict['password']:
    15                     res = func(*args,**kwargs)
    16                     return res
    17                 username = input('username: ')
    18                 passwd = input('password: ')
    19                 for user_info in fild_data:
    20                     if username == user_info['username'] and passwd == user_info['password']:
    21                         auth_user_dict['username'] = username
    22                         auth_user_dict['password'] = passwd
    23                         res = func(*args,**kwargs)
    24                         return res
    25                 else:
    26                     print("用户名密码错误")
    27             elif auth_type == 'mysql':
    28                 print("从mysql中读取用户并验证,以print代表执行验证")
    29                 res = func(*args,**kwargs)
    30                 return res
    31             else:
    32                 print("没有这种类型的数据库")
    33         return wraper
    34     return auth_func
    35 
    36 @auth('mysql')
    37 def home(name):
    38     print("%s is login in home" % name)
    39 
    40 home('test')
    41 
    42 #输出
    43 从mysql中读取用户并验证,以print代表执行验证
    44 test is login in home
  • 相关阅读:
    Django 想要单独执行文件
    Django基础
    Bootstrap框架
    Font Awesome矢量图标框架
    js函数式编程——蹦床函数
    ie被hao.360劫持的解决方法
    函数式编程——惰性链
    你可能不知道的BFC在实际中的应用
    高度随宽度适应的响应式方案
    腾讯云播放器更新——TCplayer
  • 原文地址:https://www.cnblogs.com/xiaoqianghuihui/p/6710365.html
Copyright © 2020-2023  润新知