`
郭广川
  • 浏览: 68993 次
  • 性别: 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

分享到:
评论

相关推荐

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

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

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

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

    mfc下实现回调函数

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

    实变函数 (周民强).pdf

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

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

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

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

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

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

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

    MATLAB核函数算法

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

    Windows API 函数参考手册

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

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

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

    sublime显示函数列表插件

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

    复变函数.pdf

    复变函数是数学中处理复数的函数的一门学科,它在理论和应用上都有着广泛的影响。在本文件中,首先介绍了复数的基础...通过这些知识点的学习,可以对复数有一个全面的认识,为后续深入学习复变函数理论打下坚实的基础。

    不完全伽马函数的计算

    不完全伽马函数在数学和计算机科学中是一个重要的特殊函数,尤其在概率论、统计学、信号处理等领域有着广泛的应用。在VC(Visual C++)环境中实现不完全伽马函数的数值计算,需要理解该函数的定义、性质以及如何通过...

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

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

    C++画数学函数图象

    1. vs2008里弄了一个画数学函数的类,基本的函数都可以画,当然复杂的也可以,只是函数本身需要调用者设计,已经变量的范围 2. 最后的图象提供两种方式输出,一个是bmp文件,一个是gif图象,gif需要注意它的256种...

    PostgreSQL简单函数创建

    创建一个C语言编写的PostgreSQL自定义函数主要包括以下步骤: 1. **编写C代码**:首先,你需要用C语言编写函数的主体部分。这个函数需要遵循PostgreSQL的API,比如声明输入参数、返回类型,以及函数体内的处理逻辑...

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

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

    c#函数库(比较常用)

    C#是一种面向对象的编程...这个C#函数库可能包含以上部分或全部知识点的实现,为初学者提供了一个实用的起点。通过学习和实践这些函数,开发者能够更好地理解和掌握C#的核心概念,为进一步深入学习和开发打下坚实基础。

    matlab时频分析工具箱+安装方法+函数说明.

    一、信号产生函数: amexpo1s 单边指数幅值调制信号 amexpo2s 双边指数幅值调制信号 amgauss 高斯幅值调制信号 amrect 矩形幅值调制信号 amtriang 三角形幅值调制信号 fmconst 定频调制信号 fmhyp 双曲线频率调制...

Global site tag (gtag.js) - Google Analytics