在python中自动定义新函数

时间:2015-01-12 08:15:55

标签: python

我有一些数据存储在对象Foo()中。

Foo.data是n x m np.array的列表,其中每个数组代表特定时间的一些实验数据。该数组由m个变量组成,n对应于已经进行测量的不同点的数量。

我们可以考虑使用变量名称列表,例如:

var_names=['x','volume','u','L_bar','rho','P',.....]

我想让数据更易于访问,定义如下内容:

def Foo.P(self,x,time)
    index_t=time_list.index(time)
    index_x=var_names.index(x)
    index_P=var_names.index(P)
    return Foo.data[index_t][index_x,index_P]

问题是:考虑到变量列表不是固定的,但它可以变化,我是否可以自动定义一些我之前显示的函数而不为每个变量明确定义一个?

我的意思是,我希望有一堆函数,如Foo.P,Foo.volume,Foo.u,Foo.rho,它们提取函数名称给出的变量的值,用于(x ,时间)位置,没有逐一定义所有这些。

2 个答案:

答案 0 :(得分:2)

您可以通过在Foo上定义特殊__getattr__方法来实现,如下所示:

def __getattr__(self, name):
    """If name is known, return a function to get that data for given (x, time)."""
    if name not in var_names: # name not known
        raise AttributeError
    return lambda x, time: self.data[time_list.index(time)][var_names.index(x), var_names.index(name)]

答案 1 :(得分:1)

为什么不通过这个名字?像这样:

#!/usr/bin/python
# -*- coding: utf-8 -*-


var_names=['x','volume','u','L_bar','rho','P']

def general_foo(self, name, x, time)
    index_t=time_list.index(time)
    index_x=var_names.index(x)
    index_P=var_names.index(name)
    return Foo.data[index_t][index_x,index_P]

for var in var_names:
    general_foo(var, x, time)