`
郭广川
  • 浏览: 69233 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

给函数添加装饰方法(一个二逼大学同学的故事)

 
阅读更多

给大家讲一个我的一个二逼大学同学的故事:

 

有一个函数func_a(arg),他有这么一种需求,想在该函数执行前和执行后加入处理逻辑,按照平常的思路他是这么进行设计的:

def func_a(arg):

    ……

def func_b(arg):

    …… # do something before

    func_a(arg)

    …… # do something after 

然后他在他的程序中需要用到func_b(arg)的地方都写上该函数的调用,并且他调用的地方很多,而有一天他的老板对他说:你的函数处理之前和处理之后的逻辑需要变更,为了应对新需求,他如此做:定义一个新的函数

def func_c(arg):

    …… # do something before

    func_a(arg)

    …… # do something after 

之所以他没有直接在func_b上修改而是新建了一个func_c是因为func_b中的do something对他来说比较重要,他担心他老板明天让他把逻辑又还原回func_b,所以聪明的他对func_b进行了备份不更改,而是新建了func_c,可是问题来了,他不得不ctrl+f查找所有文件中的func_b,然后替换成func_c,可怜的是,调用func_b的地方很多,他自觉蛋疼无比,不得不带着烦躁的心一个接一个的替换,下班前他终于修改好了,信心满满的提交修改后的代码,可是第二天,fuck,他发现程序运行出错,原因是有个func_b忘了替换

,于是老板把他叫到办公室。。。

知道他的遭遇,我表示万分同情,于是我告诉他:你可以这么做,我给了他一个小示例:

def func_decorate1(func):
    def check(arg):
        print 'Before the function execution, you can do thing here(func_decorate1)'
        func(arg)    
        print 'After the function execution, you can do thing here(func_decorate1)'
    return check

def func_decorate2(func):
    def check(arg):
        print 'Before the function execution, you can do thing here(func_decorate2)'
        func(arg)    
        print 'After the function execution, you can do thing here(func_decorate2)'
    return check

@func_decorate1 # here!!!!!!!
def my_func(arg):
    print arg

my_func('My function is being executed')

 运行结果是:

Before the function execution, you can do thing here(func_decorate1)
My function is being executed
After the function execution, you can do thing here(func_decorate1)

 

def func_decorate1(func):   
    def check(arg):   
        print 'Before the function execution, you can do thing here(func_decorate1)'  
        func(arg)       
        print 'After the function execution, you can do thing here(func_decorate1)'  
    return check   
  
def func_decorate2(func):   
    def check(arg):   
        print 'Before the function execution, you can do thing here(func_decorate2)'  
        func(arg)       
        print 'After the function execution, you can do thing here(func_decorate2)'  
    return check   
  
@func_decorate2 # here!!!!!!!   
def my_func(arg):   
    print arg   
  
my_func('My function is being executed')  

  

运行结果是:

Before the function execution, you can do thing here(func_decorate2)
My function is being executed
After the function execution, you can do thing here(func_decorate2)

 

他看了看,笑了笑,默默的回到了他的工位上,敲!代!码!!!!

 

如果看客们没懂,就看看我的这个二逼大学同学的一篇垃圾博客吧,或许会对你有些帮助,反正他的博客我已经无法直视了,欢迎吐槽

 http://blog.csdn.net/u011252084/article/details/14448179

分享到:
评论

相关推荐

    Python装饰器详解:函数增强的利器

    装饰器本质上是一个函数,它接受一个函数作为参数并返回一个新的函数。这种设计模式使得装饰器成为实现横切关注点(如日志记录、性能测试、事务处理、缓存等)的理想选择。本文将详细介绍Python中装饰器的概念、使用...

    Unity3d 在Inspector 中 设置添加回调函数

    在做一些开场动画或者其它指定事件触发 一类功能时,需要在编辑环境下设置添加回调函数。 一开始尝试直接使用delegate 来编写,测试发现没有效果,在谷歌搜索到Unity论坛有人提到 delegate 不能被序列化到Inspector...

    建立一个名为Student的类,该类有以下几个私有成员变量:学生姓名、学号、性别、年龄。还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。

    还有以下两个成员函数:一个用于初始化学生姓名、学号、性别和年龄的构造函数,一个用于输出学生信息的函数。编写一个主函数。声明一个学学生对象。然后调用成员函数在屏幕输出学生信息。 编程环境:vs2010,语言:...

    YOLOv5|YOLOv7|YOLOv8改各种IoU损失函数:YOLOv8涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数-CSDN博客.mhtml

    YOLOv5|YOLOv7|YOLOv8改各种IoU损失函数:YOLOv8涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数-CSDN博客.mhtml

    求解二次规划问题的拉格朗日及有效集方法(包含Matlab代码)

    由于二次规划比较简单,便于求解(仅次于线性规划),并且一些非线性优化问题可以转化为求解一些列的二次规划问题,因此二次规划的求解方法较早引起人们的重视,称为求解非线性优化的一个重要途径。二次规划的算法较...

    Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法。分享给大家供大家参考,具体如下: 一、装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所以我们...

    mfc下实现回调函数

    当需要将回调函数传递给其他函数时,通常需要一个用户数据指针,因为静态成员函数没有`this`指针。这个指针可以在回调函数中用来获取调用该函数的对象实例。例如,你可以使用`AfxSetUserWindowProc`或`...

    遗传算法的适应度函数构造

    本文将详细解释遗传算法中的适应度函数,包括适应度函数的作用、设计要求、常见的适应度函数、尺度变换方法以及改进算法。 适应度函数的作用 在遗传算法中,适应度函数是度量个体在优化计算中有可能达到或接近于最...

    在simulink中应用s函数的一个简单实例

    在本实例中,我们将探讨如何在Simulink中应用S函数来设计一个简单的连续系统。 首先,理解S函数的基本结构至关重要。S函数分为两种类型:MATLAB S函数和C/C++ S函数。MATLAB S函数直接用MATLAB脚本编写,适合快速...

    MATLAB核函数算法

    RBF核函数能够在高维空间中创建一个“平滑”决策边界,适合处理非线性问题。MATLAB中使用`kernel('rbf', X, Y, 'gamma', gamma)`进行设置。选择适当的gamma值对于RBF核的性能至关重要。 4. **Sigmoid核函数...

    复变函数与积分变换(pdf)

    积分变换是一种数学工具,它通过将函数的自变量从一个空间变换到另一个空间,将复杂的数学问题转换为更容易解决的问题。在工程数学中,常用的积分变换有傅里叶变换、拉普拉斯变换、Z变换等。这些变换能够在信号处理...

    Windows API 函数参考手册

    书中详细介绍了每一个Win32 API函数的使用方法,其中着重介绍其原型表示、函数说明、参数说明、注意事项、相应头文件(.H)、链接库(.LIB或.DLL)和典型示例。对于每个函数《Windows API 函数参考手册》给出了相应...

    Lapack fortran版所有函数的使用方法+中文帮助手册

    LAPACK(线性代数应用程序的并行模板库)是用于解决大型、密集线性代数问题的一个强大工具,广泛应用于科学计算和工程领域。它由FORTRAN编写,提供了丰富的函数库,涵盖了从基本矩阵运算到高级数值算法的各种功能。...

    sublime显示函数列表插件

    ctags可以解析多种编程语言的语法,生成一个索引文件,使得编辑器能够快速定位到函数、类、变量等编程元素的定义位置。因此,理论上FuncPreview可以通过适当的配置和扩展,以支持ctags支持的所有语言,如C、C++、...

    实变函数 (周民强).pdf

    实变函数是数学分析中的一个核心分支,主要研究集合论和拓扑学结构下的函数性质。与初等的微积分课程相比,实变函数更加深入地探讨了函数、极限、连续性、可微性和可积性等概念的内涵,并运用集合论和测度论的方法...

    实变函数论(第2版)周民强 最高清 完整

    普通高等教育“九五”教育部重点教材,是为综合大学、理工科大学、高等师范院校数学系、应用数学系本科生编写的“实变函数”课程教材,主要介绍Lebesgue测度与积分理论、共分六章:集合与点集,Lebesgue测度,可测...

    三角函数的Verilog代码实现

    固定点表示需要指定一个定点位置,所有数值都是相对于这个点进行运算的。在Verilog中,可以定义`reg`类型变量,并设定合适的位宽来表示固定点数。 6. **模块化设计** 在Verilog中,为了提高代码的可读性和重用性,...

    C语言标准函数库详解.pdf

    每个头文件都提供了不同的函数,例如:头文件提供了断言函数assert(),用于在程序中添加断言语句,以便检查程序的逻辑正确性。头文件提供了一组字符类别测试函数,例如:isdigit()、isalpha()、isupper()等,用于...

    复变函数完整教材 复变函数

    如果一个复变函数在复数域的某个区域内可微分,那么该函数就是解析的。为了判断一个函数是否解析,可以利用柯西-黎曼方程来判别。当函数\(f(z)\)满足柯西-黎曼方程时,我们可以判定\(f(z)\)在该点是解析的。 复变...

Global site tag (gtag.js) - Google Analytics