zoukankan      html  css  js  c++  java
  • python装饰器1

    装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

    这里举一个简单例子,例如,小琨要吃冰激凌,小明要吃冰果,小王要吃老冰棍

     1 # -*- coding utf-8 -*-
     2 
     3 def a():
     4     print("小琨吃冰激凌")
     5 
     6 def b():
     7     print("小明吃冰果")
     8 
     9 def c():
    10     print("小王吃老冰棍")
    11 
    12 a()
    13 b()
    14 c()
    15 
    16 
    17 小琨吃冰激凌
    18 小明吃冰果
    19 小王吃老冰棍

    但是他们吃之前没有洗手,三个人都要先洗手再吃,在不修改原有函数下:

     1 # -*- coding utf-8 -*-
     2 
     3 def first(func):
     4     def inner():
     5         print("先洗手")
     6         return func()
     7     return inner
     8 
     9 @first
    10 def a():
    11     print("小琨吃冰激凌")
    12 
    13 @first
    14 def b():
    15     print("小明吃冰果")
    16 
    17 @first
    18 def c():
    19     print("小王吃老冰棍")
    20 
    21 a()
    22 b()
    23 c()
    24 
    25 
    26 先洗手
    27 小琨吃冰激凌
    28 先洗手
    29 小明吃冰果
    30 先洗手
    31 小王吃老冰棍

    如果被装饰的函数需要带参数的情况下:

     1 # -*- coding utf-8 -*-
     2 
     3 def first(func):
     4     def inner(arg):
     5         print("先洗手")
     6         return func(arg)
     7     return inner
     8 
     9 @first
    10 def a(aaa):
    11     print("小琨吃冰激凌,%s"%aaa)
    12 
    13 @first
    14 def b(bbb):
    15     print("小明吃冰果,%s"%bbb)
    16 
    17 @first
    18 def c(ccc):
    19     print("小王吃老冰棍,%s"%ccc)
    20 
    21 a("不洗手,以后剁手")
    22 b("不洗手,以后剁手")
    23 c("不洗手,以后剁手")
    24 
    25 
    26 先洗手
    27 小琨吃冰激凌,不洗手,以后剁手
    28 先洗手
    29 小明吃冰果,不洗手,以后剁手
    30 先洗手
    31 小王吃老冰棍,不洗手,以后剁手
  • 相关阅读:
    20145127 《Java程序设计》第一周学习总结
    Java 问卷调查
    一个没有成就而即将退赛的OIer的告别书
    【深度优先搜索】MZOJ_1344工作依赖
    【算法随笔】最小生成树
    【数据结构】二叉树 学习笔记1
    【深度优先搜索】NOIP2017_D2T1 洛谷3958奶酪
    【树形DP】MZOJ_1063_士兵守卫
    【算法随笔】写一个自己的名词空间
    【树形DP】洛谷1122_最大子树和
  • 原文地址:https://www.cnblogs.com/fanyunpeng/p/6306684.html
Copyright © 2011-2022 走看看