zoukankan      html  css  js  c++  java
  • python自动化开发4

    装饰器之我见

      python里的装饰器到底是个什么东东,初看起来,可能有的小伙伴会发懵啊,哈哈。

      先来个装饰器的例子瞅瞅:

       

     1  Author:RYB
     2 # __*__coding:utf-8__*__
     3 
     4 '''
     5 dec函数通过用户名和密码实现验证功能。
     6 '''
     7 def dec(func):
     8     def auth():
     9         username = "ryb"
    10         password = "123456"
    11         user = input("username:").strip()
    12         passwd = input("password:").strip()
    13         if user == username and passwd == password:
    14             msg = print("验证通过,欢迎来到京东商城!")
    15         elif user == username and passwd != password:
    16             msg = print("密码不正确,请输入正确的密码!")
    17         elif user != username and passwd != password:
    18             msg = print("用户名和密码均不正确,请输入正确的用户名和密码!")
    19         else:
    20             msg = print("用户名不正确,请输入正确的用户名!")
    21     return auth
    22 
    23 #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
    24 @dec
    25 def jd():
    26     print("welcome to jd!")
    27 
    28 #执行jd函数
    29 jd()
    View Code

       上面装饰器例子(函数版):可读性更强一些哈哈

        

     1 # Author:RYB
     2 # __*__coding:utf-8__*__
     3 
     4 #用户名和密码都正确
     5 def user_passd_right():
     6     msg = print("验证通过,欢迎来到京东商城!")
     7 
     8 
     9 #用户名正确,密码不正确
    10 def useright_passd():
    11     print("密码不正确,请输入正确的密码!")
    12 
    13 #用户不正确,密码正确
    14 def user_passdright():
    15     print("用户名不正确,请输入正确的用户名!")
    16 
    17 #用户名和密码都不正确
    18 def user_passd():
    19     print("用户名和密码均不正确,请输入正确的用户名和密码!")
    20 
    21 '''
    22 dec函数通过用户名和密码实现验证功能。
    23 '''
    24 def dec(func):
    25     def auth():
    26         username = "ryb"
    27         password = "123456"
    28         user = input("username:").strip()
    29         passwd = input("password:").strip()
    30         if user == username and passwd == password:
    31             user_passd_right()
    32             func()
    33         elif user == username and passwd != password:
    34             useright_passd()
    35         elif user != username and passwd != password:
    36            user_passd()
    37         else:
    38             user_passdright()
    39     return auth
    40 
    41 #@dec <==> jd=dec(jd),dec函数用来给jd函数添加验证功能,所以dec函数是装饰器。
    42 @dec
    43 def jd():
    44     print("welcome to jd!")
    45 
    46 #执行jd函数
    47 jd()
    View Code

         

    那么到底装饰器是个什么东西呢?我想,通过上面的例子说的通俗一些,伙伴们多少知道一些吧。装饰器其实也是一个函数,一个用来包装函数的函数,装饰即修饰,意指为其他函数添加新功能。

      装饰器定义:本质就是函数,功能是为其他函数添加新功能

      装饰器需要遵循的原则:

        1.不修改被装饰函数的源代码(开放封闭原则);

        2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式。

      装饰器知识储备:装饰器=高阶函数+函数嵌套+闭包

      装饰器的例子1:

        

     1 # Author:RYB
     2 # __*__coding:utf-8__*__
     3 import time
     4 
     5 def timer(func):
     6     def wrapper():
     7         start_time = time.time()
     8         func()
     9         stop_time = time.time()
    10         print('run time is %s' %(stop_time-start_time))
    11     return wrapper
    12 #@timer等价index=timer(index)
    13 @timer
    14 def index():
    15     print("in the index")
    16 index()
    View Code

     运行结果如下:  

      in the index
      run time is 0.0

      装饰器的例子2:有参数的

        

     1 # Author:RYB
     2 # __*__coding:utf-8__*__
     3 
     4 import time
     5 def timer(func):
     6     def wrapper(*args,**kwargs):
     7         start_time = time.time()
     8         res=func(*args,**kwargs)
     9         stop_time = time.time()
    10         print('run time is %s' %(stop_time-start_time))
    11         return res
    12     return wrapper
    13 
    14 #@timer等价index=timer(index)
    15 @timer
    16 def index(msg):
    17     print("in the index:",msg)
    18     return 1
    19 res=index("hello myworld")
    20 print(res)
    View Code

    运行结果:  

      in the index: hello myworld
      run time is 0.0
      1

  • 相关阅读:
    大型网站技术架构(七)网站的可扩展性架构
    【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验
    结合案例深入解析模板方法设计模式
    android开发之自定义View 详解 资料整理 小冰原创整理,原创作品。
    1309:【例1.6】回文数(Noip1999)
    jQuery dataTables四种数据来源[转]
    CYQ.Data 轻量数据层之路 使用篇-MProc 存储过程与SQL 视频[最后一集] H (二十八)
    CRM系统项目总结
    同源策略:JSONP和CORS
    forms表单与modelfrom使用
  • 原文地址:https://www.cnblogs.com/renyongbin/p/6393178.html
Copyright © 2011-2022 走看看