• Python--装饰器


    1、装饰器:
    定义:本质是函数,用于装饰其他函数:就是为其他函数添加附加功能。
    原则:1.不能修改被装饰的函数的源代码
    2.不能修改被装饰的函数的调用方式
    2、实现装饰器知识储备:
    1). 函数即“变量” #大楼房间-门牌号 -->内存释放机制
    2). 高阶函数
    a: 把一个函数名当作实参传给另一个函数(在不修改被装饰函数源代码的情况下为其添加功能)
    b: 返回值中包含函数名(不修改函数的调用方式)
    3). 嵌套函数
    3、高阶函数 + 嵌套函数 =》 装饰器

    示例一(初级):装饰器作用,计算被装饰函数的执行时间。
     1 # -*- coding:utf-8 -*-
     2 import time
     3 
     4 def timer(func):
     5     def deco(*args,**kwargs):
     6         start_time = time.time()
     7         func(*args,**kwargs)
     8         stop_time = time.time()
     9         print("the func run time is %s" %(stop_time-start_time))
    10     return deco
    11 
    12 @timer
    13 def test1():
    14     time.sleep(2)
    15     print("in the test1")
    16 
    17 @timer      # @timer等价于:test2=timer(test2)=deco
    18 def test2(name,age):
    19     time.sleep(3)
    20     print("info:%s,%s" %(name, age))
    21 
    22 test1()
    23 test2("tj", 23)  #等价于:deco("tj", 23)
    24 
    25 >>>
    26 in the test1
    27 the func run time is 2.009901523590088
    28 info:tj,23
    29 the func run time is 3.009861946105957

    示例二(进阶)、装饰器作用,进入页面前进行用户验证,当进入home页面时,使用验证方法a,当进入bbs页面时,使用验证方式b,此示例中没有b验证方式,仅演示a验证方式。

     1 user="abc"
     2 password="abc123"
     3 
     4 def auto_outside(type):
     5     def wrpper(func):
     6         def deco(*args, **kwargs):
     7             if type == "a":
     8                 username=input("Username:")
     9                 passwd=input("Password:")
    10                 if username==user and passwd==password:
    11                     print("登录成功")
    12                     return func(*args, **kwargs)
    13                 else:
    14                     print("用户名或密码错误")
    15             elif type == "b":
    16                 print("用什么b")
    17         return deco
    18     return wrpper
    19 
    20 def index():
    21     print("welcome to index pages")
    22 
    23 @auto_outside(type="a")  #type为验证方式类型
    24 def home():
    25     print("welcome to home pages")
    26     return "from home"
    27 
    28 @auto_outside(type="b")
    29 def bbs():
    30     print("welcome to bbs pages")
    31 
    32 index()
    33 print(home())
    34 bbs()
    35 
    36 >>>
    37 welcome to index pages  # index页面不需要验证
    38 Username:abc
    39 Password:abc123
    40 登录成功
    41 welcome to home pages   # home页面使用a验证方式,登录成功后进入页面
    42 from home 
    43 用什么b  # 进入bbs页面前提示没有b验证方式
     
  • 相关阅读:
    Vue.js依赖收集
    Vue.js响应式原理
    详解.Net 如何上传自己的包到Nuget平台以及如何使用Nuget包管理器
    利用docker容器运行.net core webapi
    wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!
    算法之A星算法(寻路)
    Python 学习日记 第一天
    Python 学习日记 第三天
    Python 学习日记 第二天
    再做一题,2013616更新
  • 原文地址:https://www.cnblogs.com/sunnytomorrow/p/13081073.html
Copyright © 2020-2023  润新知