zoukankan      html  css  js  c++  java
  • python初级装饰器编写

    最近项目太忙好久没有学习python了,今天更新一下吧~~

    1.什么是python装饰器:

      装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象,它经常用于有切面的需求的场景,比如:插入日志,性能测试,事务处理,缓存,权限校验等场景,装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用

    概括的讲,装饰器的作用就是为已存在的函数或对象添加额外的功能

    2.上代码练习初级装饰器的写法:

      

     1 """定义一个装饰器"""
     2 
     3 
     4 def debug(func):
     5     def wrapper():
     6         print("[debug]:enter {} ()".format(func))
     7         return func()
     8     return wrapper
     9 
    10 
    11 @debug
    12 def say_hello():
    13     print('hello')
    14 
    15 
    16 say_hello()
    17 
    18 
    19 """这个debug函数其实就是一个装饰器,他对原函数进行了包装并返回了另外一个函数,额外添加了一些功能"""
    20 
    21 """这是一个最简单的装饰器,那么一个问题也出现了,如果被装饰的函数需要传入参数,那么这个装饰器就坏了,因为返回的函数并不能接受参数,可以修改为
    22     指定装饰器函数wrapper接受和原函数一样的参数如:
    23 """
    24 
    25 
    26 def debug2(func):
    27     def wrapper(saysomething):
    28         print("[debug]:enter {} ()".format(func))
    29         return func(saysomething)
    30     return wrapper
    31 
    32 
    33 @debug2
    34 def say_hello1(saysomething):
    35     print(saysomething)
    36 
    37 
    38 say_hello1('哈哈哈')
    39 
    40 
    41 """但是又出现了n个问题,因为有很多函数,你只管你自己的函数,别人的函数参数是什么样子,那么解决方案就是python提供了可变参数
    42     *args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数了.
    43 """
    44 
    45 
    46 def debug3(func):
    47     def wrapper(*args,**kwargs):
    48         print("[debug]:enter {} ()".format(func))
    49         print('Prepare and say...')
    50         return func(*args,**kwargs)
    51     return wrapper
    52 
    53 
    54 @debug3
    55 def say(something):
    56     print('hello{}'.format(something))
    57 
    58 
    59 @debug3
    60 def say1(one,two):
    61     print('先说一件事:{} 再说第二件事:{}'.format(one,two))
    62 
    63 
    64 say('说一下可变参数')
    65 say1('下班','吃饭')
    66 
    67 
    68 
    69 """恭喜你至此,你已经掌握了初级的装饰器的写法"""

    后续在深入学习装饰器的写法~~~

  • 相关阅读:
    java命令模式
    java中介者模式
    java访问者模式
    java状态模式
    java责任链模式
    java策略模式(及与工厂模式的区别)
    github token 位置
    Yii2 Queue队列
    sz与rz
    vim
  • 原文地址:https://www.cnblogs.com/jiyanjiao-702521/p/9811952.html
Copyright © 2011-2022 走看看