• 装饰器


     
    装饰器:
      定义:本质是函数,功能是用来装饰其他函数(就是为其他函数添加附加功能)。
      原则:1、不能修改被装饰的函数的源代码
           2、不能修改被装饰的函数的调用方式
    装饰器对于被装饰的函数是透明的(既函数本身不知道自己被装饰)
     
     
    实现装饰器知识储备:
      1、函数即“变量”
      2、高阶函数
        a.把一个函数名当作参数传递给另外一个函数
        b.返回值中包含函数名
      3、函数嵌套
     
    小结:利用高阶函数+嵌套函数完成装饰器的功能
     
    例子:
     1 user = 'daxin'
     2 passwd = '123456'
     3 
     4 def auth_type(auth_type):
     5     def auth(func):
     6         def auth_page(*args):
     7             if auth_type == 'local':
     8                 username = input('Please input your user:')
     9                 password = input("Please input your passwd:")
    10                 if username == user and passwd == password:
    11                     func(*args)
    12                 else:
    13                     print('Username or password Error!')
    14             else:
    15                 print('LDAP')
    16                 func(*args)
    17         return auth_page
    18     return auth
    19 
    20 def index():
    21     print('in the index page')
    22 @auth_type('local')      --> local传递到最外层的func
    23 def home():
    24     print("in the home page")
    25 @auth_type('ldap')
    26 def bbs():
    27     print('in the bbs page')
    28 
    29 index()
    30 home()
    31 bbs()

    例子2:

     1 import functools
     2 
     3 def decorator(logintype='3'):
     4     def decorator1(func):
     5         @functools.wraps(func)
     6         def wrapper(*args,**kwargs):
     7             if logintype == '1':
     8                 print('begin call')
     9                 func(*args,**kwargs)
    10                 print('end call')
    11             elif logintype == '2':
    12                 print('start call')
    13                 func(*args,**kwargs)
    14                 print('over call')
    15             else:
    16                 print('test start')
    17                 func(*args,**kwargs)
    18                 print('test start')
    19         return wrapper
    20     return decorator1
    21 
    22 
    23 @decorator()
    24 def a(name):
    25     print('in the F name is %s' % name)
    26 
    27 @decorator('2')
    28 def b():
    29     print('in the B')
    30 @decorator('1')
    31 def c():
    32     print("in the C")
    33 
    34 c()
    35 b()
    36 a('123')
  • 相关阅读:
    P2824 [HEOI2016/TJOI2016]排序
    P4930「FJ2014集训」采药人的路径
    FlexboxLayout 的一些基本介绍与基本用法
    Android——打造万能适配器(CommonAdapter)
    关于list、set、map的几点总结
    equals()和hashCode()区别?
    Android开发艺术探索(一)——Activity的生命周期和启动模式
    Android开发艺术探索(三)——View的事件体系
    Android五大布局重新回顾
    Android基础知识回顾
  • 原文地址:https://www.cnblogs.com/dachenzi/p/6616968.html
Copyright © 2020-2023  润新知