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('您输入的对象有误')
  • 相关阅读:
    [书目20130415]改变:28天让自己内心强大
    [引]软件著作权登记申请所需文件
    [转]动软代码生成器之模板功能介绍
    [转]C# 冒泡排序你还会吗?
    [转]细说ASP.NET Forms身份认证
    [转]listview加载性能优化ViewHolder
    [转]App for Android (2) —— Python篇
    [转]sqlserver 创建分区表
    [转]c# 四舍五入、上取整、下取整
    常用 Java 静态代码分析工具的分析与比较
  • 原文地址:https://www.cnblogs.com/beargod/p/10186985.html
Copyright © 2011-2022 走看看