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

分享到:
评论

相关推荐

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

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

    功率谱估计、自相关函数估计、相干函数

    提到的TOA(到达时间)/TDOA(到达时间差)估计是无线定位的一种方法。在这个例子中,通过估计信号的功率谱密度和互相关谱密度,然后计算相干函数,可以估计信号源相对于接收器的位置。`TDOA=ifft(sxyf,2047)` 步骤...

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

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

    Windows API 函数参考手册

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

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

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

    sublime显示函数列表插件

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

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

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

    复变函数.pdf

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

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

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

    C++画数学函数图象

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

    多项式拟合函数polyfit之C语言的源码

    在数学和计算机科学中,多项式拟合(Polynomial Fitting)是一种常用的数据拟合方法,它可以将一组数据点拟合成一个多项式函数。Polyfit 是一种经典的多项式拟合算法,广泛应用于科学计算、数据分析和机器学习等领域...

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

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

    实变函数与泛函分析概要 答案

    一个函数如果对于任意的实数\(a\),集合\(\{x|f(x) > a\}\)都是可测的,则称该函数为可测函数。 - **积分理论**:实变函数理论中的积分理论通常指的是勒贝格积分,它是黎曼积分的推广,能够处理更多种类的函数。 - *...

    c#函数库(比较常用)

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

    c++ 实现matlab smooth 函数

    在每种情况下,我们都使用一个循环来计算平滑值,然后将结果存储在输出数组 `y` 中。 C++ 实现 Matlab Smooth 函数可以使用上述代码来实现平滑一维数组数据,该方法基于 Matlab 的 smooth 函数原理,并且可以在 C++...

    C#写的各种拟合函数

    在C#中,我们可以构建一个n次多项式的函数,例如`y = a + bx + cx^2 + ... + nx^n`,通过最小二乘法求解系数a, b, c,..., n。最小二乘法的目标是找到一组系数,使得所有数据点到拟合曲线的平方误差之和最小。 2. **...

    语音端点检测matlab程序含enframe函数

    enframe函数的基本用法是接收一个声音信号和窗函数参数,然后按照设定的帧移和帧长对信号进行切片。这允许我们对每一帧进行独立处理,如进行能量计算、短时傅立叶变换等。 下面我们将详细探讨这个过程: 1. **信号...

    ocx函数查看器

    这就需要一个工具来帮助我们窥探其内部结构,OCX函数查看器正是为此目的而设计。 使用OCX函数查看器,开发者可以: 1. **探索函数库**:此工具允许用户查看OCX控件中定义的所有函数和方法,这在调试或集成OCX组件...

    将Matlab的M函数引用到Simulink中.pdf

    例如,在上述模型中,`MATLAB Fcn`模块被设置为调用`peng`函数,其中第一个输入`x`设为常数2,第二个输入`t`则由Simulink的`Clock`模块提供,表示当前仿真时间。 ### 二、使用SubSystem模块提升灵活性 #### ...

Global site tag (gtag.js) - Google Analytics