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 小王吃老冰棍,不洗手,以后剁手
  • 相关阅读:
    Android LogCat使用详解
    新时代新潮流WebOS 【20】WebKit的结构与解构
    Android调试的必杀技——反汇编
    真机缺少com.google.android.maps.jar解决方法:
    test
    VMware让ubuntu与win7共享文件方法
    android手机通过笔记本无线wifi上网
    新时代新潮流WebOS 【22】WebKit,鼠标引发的故事
    获取证书
    获取局域网内部机器的MAC地址
  • 原文地址:https://www.cnblogs.com/fanyunpeng/p/6306684.html
Copyright © 2011-2022 走看看