Python 动态成员集的自然命名方案

Python 动态成员集的自然命名方案,python,dynamic,Python,Dynamic,用户希望实例化一个表示跨点的类,并自动访问所表示的每个变量(最多200个变量)的成员项。变量类实例集基于基于文件的输入数据是动态的,我们希望使用文件提供的变量名来创建这些变量实例的集合,这些变量实例可以通过自然命名方案访问。实际上,变量类隐藏了数据存储位置和独立变量(即时间)存储位置的详细信息。以下伪代码表示最终用户可能表示的随机行。在某些情况下,后处理可能要广泛得多 tran1 = CTransient('TranData', ...) Padj = tran1.pressPipe1 + 10

用户希望实例化一个表示跨点的类,并自动访问所表示的每个变量(最多200个变量)的成员项。变量类实例集基于基于文件的输入数据是动态的,我们希望使用文件提供的变量名来创建这些变量实例的集合,这些变量实例可以通过自然命名方案访问。实际上,变量类隐藏了数据存储位置和独立变量(即时间)存储位置的详细信息。以下伪代码表示最终用户可能表示的随机行。在某些情况下,后处理可能要广泛得多

tran1 = CTransient('TranData', ...)
Padj = tran1.pressPipe1 + 10  # add 10 bar to a pressure for conservatism
Tsat = TsatRoutine( tran1.tempPipe1 )
MyPlotRoutine( tran1.tempPipe1, tran1.tempPipe2 )
其中,输入数据文件中定义的pressPipeX和tempPipeX名称以及相应的numpy数据向量在“TranData”文件输入文件中指定,并且是CVVariable类的实例


关于如何动态构建表示瞬态变量的实例集以便访问这些变量的帮助将不胜感激。

您对尝试执行的操作的描述并不完全清楚,但自动命名变量something1、something2等通常是个坏主意。改为使用列表:

transientvariables = []
transientvariables.append(makenewtransientvariable())
# ...
for tv in transientvariables:
    print tv
编辑:好的,我想我明白你的意思了,尽管你的解释仍然不太容易理解。你有一组管道,每个管道都记录了温度和压力的时间序列,对吗

最简单的方法是使用字典:

transients["tempPipe1"]
或嵌套字典:

transients["temp"]["Pipe1"]
或者您可以重写类的“
\uuuu getattr\uuuu
方法,以便它在字典中查找,您可以执行以下操作:

transients.tempPipe1
编辑2:覆盖
\uuuu getattr\uuuu
看起来有点像这样:

def __getattr__(self, name):
    if name in self.varMap:
        return self.varMap[name]
    raise AttributeError

感谢您的反馈,我会跟进;但是,我已经扩展到更好地描述意图。对不起,不清楚。想象一下数百个数据集,每个数据集包含数百个变量。在运行时,必须构造输入数据,以便调用tran.tempParam,以便tempParam对象可以使用getattr提供numpy数组。为其实例化tempParam的类对象隐藏有关numpy数组访问的详细信息。这个在给定定义(作为trans输入数据的一部分提供)的情况下,应如何动态实例化大量类成员。也许仅仅动态构建实例化代码并在构造函数中运行exec是可以接受的。@tnt:您的变量是否存储在numpy数组中?或者每个变量都是numpy数组?我认为“类成员”是指实例的属性。如果是这样的话,我根本就不会让它们成为属性。制作一个将名称映射到对象的字典,然后覆盖
\uuu getattr\uuuu
以执行字典查找。确定。谢谢你把你的观点讲清楚了。numpy数组实际上存储在hdf文件(PyTables)中,变量类实例将知道它们存储在哪里,getattr的类重写可以执行“查找”并返回numpy数组。因此,您的建议是将这些对象实例与getattr覆盖一起映射。对于最终用户来说,它比我所看到的要详细一点(例如,tran.varMap[“tempVar1”]而不是tran.tempVar1)。但是,我现在倾向于您更明确和“Pythonic”的方法。@tnt:如果您愿意,您可以使用
\uu getattr\uu
隐藏该细节。我用一个例子更新了我的答案。