zoukankan      html  css  js  c++  java
  • python之路《八》装饰器

    装饰器是个好东西啊

    那么装饰器是个什么样的东西呢,他又能做些什么呢?

    1.为什么装饰器

    当我们一个程序已经构建完成,并且已经发布出去了,但是现在需要增加一个活动,例如淘宝给你发送一个今日优惠,或者开启了一个双十一的活动。那么我们如何去做呢?

    看一下下面的例子

    1 def sai_hi():
    2     print('hi')
    3 
    4 def text(func):
    5     print('活动开始')
    6     func()
    7     print('活动结束')
    8 text(sai_hi)

    答案是这样

    活动开始
    hi
    活动结束

    我们看到我们已经为这个sai_hi的活动增加了一个开始和结束的功能

    但是还是不够完美

    源代码在发布出去之后是不能随意修改的 ,因为一但修改源代码可能导致非常多的bug出现,越改越多

    所以我们需要在不改变源代码的基础上为目标增加功能怎么做呢?

     1 def text(func):
     2     def text1():
     3         print("活动开始")
     4         func()
     5         print("后的结束")
     6     return text
     7 
     8 @text # 那么这个@text的意思就是 sai_hi=text(sai_hi)
     9 def sai_hi():
    10     print('hi')
    11 
    12 sai_hi()

    那么只需要这样就给函数安全的加上功能啦

    那么当我们大函数需要传入参数呢?

     1 def timer(func):
     2     def deco(*args,**kwargs):
     3         satr_time = time.time()
     4         func(*args,**kwargs)
     5         stop_time = time.time()
     6         print('the  run time is %s' % (stop_time - satr_time))
     7     return deco
     8 @timer# text1=timer(text1)
     9 def text1():
    10     time.sleep(2)
    11     print('in the text1')
    12 @timer
    13 def text2(name):   # ------------------------------------------------------------------------------------往里面传值
    14     time.sleep(3)
    15     print('in the text2:',name)
    16 
    17 text1()
    18 text2('miki')

    是不是只需要都在第二阶里面加上参数就可以了?

    那么还有更高级的用法哦

    这样想 当我们非常的的模块 现在其中有几个模块为了安全现在需要登录验证,然而有些却不要

    或者是我现在要验证,可能过几天要向非会员什么的免费开放几天。这个时候问题来了

    在不该边源代码的情况下怎么做?我们的装饰器最高阶版就可以完成这项工作

     1 name,password='miki','abc123'
     2 def foo(auth_type):
     3     print("the foo",auth_type)
     4     def math(func):
     5         print("in the math")
     6         def deco(*args,**kwargs):
     7             if(auth_type=='local'):
     8                 usename=input('your name:').strip()
     9                 usepassword=input('your password:').strip()
    10                 if(name==usename and password==usepassword):
    11                     print('33[31;1m you success 33[0m')
    12                     res = func(*args,**kwargs)
    13                     return res # -----------------------------------原本装饰后使得func的返回值没有了 这里使得返回值出现
    14                 else:
    15                     print('33[31;1m username or password error 33[0m')
    16             elif(auth_type=='ldap'):
    17                 res = func(*args, **kwargs)
    18                 return res
    19         return deco
    20     return math
    21 def index():
    22     print('welcome to indext page')
    23 @foo(auth_type='local')  # home =foo(home)
    24 def home(miki):
    25     print('welcome to home page',name,miki)
    26     return ' form home'
    27 @foo(auth_type='ldap')
    28 def bbs():
    29     print('welcome to bbs page')
    30 index()
    31 miki=input('your age:')
    32 home(miki)
    33 bbs()

    那么此时的foo里面传入的参数可以提供验证,当验证通过则免登录。

    程序可以自行理解一下

  • 相关阅读:
    WIFI:802.11无线LAN
    如何使你的PPT更高调
    windows的注册表有什么用?
    Steeltoe之Config客户端篇
    初探Spring Cloud Config
    .NET Core开发日志——ADO.NET与SQL Server
    .NET Core开发日志——Linux版本的SQL Server
    .NET Core开发日志——视图与页面
    .NET Core开发日志——Filter
    .NET Core开发日志——Model Binding
  • 原文地址:https://www.cnblogs.com/BookMiki/p/9679681.html
Copyright © 2011-2022 走看看