zoukankan      html  css  js  c++  java
  • python 装饰器

    一.开闭原则:
    对功能的扩展开放
    对代码的修改是封闭

    二.装饰器:

    1.通用装饰器语法:

    def wrapper(fn):
    def inner(*args, **kwargs): # 聚合
    在目标函数之前
    ret = fn(*arg, **kwargs) # 打散
    在目标函数之后
    return ret
    return inner

    @wrapper
    def func():
    pass

    func()

    2. 同一个函数被多个装饰器装饰

    @wrapper1
    @wrapper2
    @wrapper3
    def func():
    pass

    1 2 3 func 3 2 1

    3. 带参数的装饰器

    def wrapper_out(参数):
    def wrapper(fn):
    def inner(*args, **kwargs): # 聚合
    在目标函数之前
    ret = fn(*arg, **kwargs) # 打散
    在目标函数之后
    return ret
    return inner
    return wrapper

    @wrapper_out(实参) # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
    def func():
    pass

    装饰器应用

     1 flag = False  # 没登录
     2 
     3 def login():
     4     global flag
     5     username = input('请输入用户名')
     6     password = input('请输入密码')
     7     if username == 'alex' and password == '123':
     8         flag = True
     9         print('登录')
    10     else:
    11         flag = False
    12         print('用户名密码错误')
    13 # 登录验证装饰器
    14 def wrapper(fn):
    15     def inner(*args, **kwargs):
    16         # 登录校验
    17         while 1:
    18             if flag == True:
    19                 ret = fn(*args, **kwargs)
    20             else:
    21                 print('对不起, 您没有登录')
    22                 login()
    23     return inner
    24 menu = ['我是被装饰1','我是被装饰2','我是被装饰3']
    25 @wrapper
    26 def chakan():
    27     print('我是被装饰1')
    28 
    29 def cha():
    30     print('我是被装饰2')
    31 
    32 def so():
    33     print('我是被装饰3')
    34 
    35 while 1:
    36      for i in range(len(menu)):
    37          print(i+1, menu[i])
    38      n = input('请输入要调戏的装饰')
    39      if n == '1':
    40          chakan()
    41      elif n == '2':
    42          cha()
    43      elif n == '3':
    44          so()
    45      else:
    46          print('您输入的对象有误')
  • 相关阅读:
    七easy网络陷阱上当
    移动端--web开展
    ContentType是否大小写区分?
    NYOJ 24 素数的距离问题
    Emoji:搜索将与您找到表情符号背后的故事
    Cocos2d-X之LUA注意事项
    [Angular] ChangeDetection -- onPush
    [Node.js] Build microservices in Node.js with micro
    [Angular] Scrolling the Message List To the Bottom Automatically Using OnChanges
    [Angular] Ngrx/effects, Action trigger another action
  • 原文地址:https://www.cnblogs.com/beargod/p/10186985.html
Copyright © 2011-2022 走看看