2015-11-06 149 views
1

我有一个函数,它返回两个列表,符号和数据,其中对应的值具有相同的索引。例如,symbols[i]给出了变量名称,data[i]给出了实际值(int)。动态创建一个类

我想用这两个列表来动态创建一个具有以下格式的静态值类:

class a: 

    symbols[i] = data[i] 
    symbols[i+1] = data[i+1] 

等等,这样我以后可以参考这样的价值观:

a.symbols[i] 
a.symbols[i+1] 

其中symbols[i]symbols[i+1]应与希望的变量名来代替,像a.var1a.var2

这怎么可能实现?

编辑:下面

所以我有一个主程序可以说,增加的细节清晰度的main(),它应该在这种风格的list.dat阅读:

dimension1;0.1 
dimension2;0.03 
dimension3;0.15 

和值分开,符号和数据列表。

所以我不知道这些列表中有多少值。我想动态地创建一个类,以便能够引用主程序中的值,并将类作为def sub1(NewClass,argument1,argument2)等参数赋予子函数。在此刻,我正在使用手动创建以下格式的简单的python列表(list.py):

dimension1 = 0.1 
dimension2 = 0.03 
dimension3 = 0.15 

,然后从列表导入*在主程序并在子功能使用,这将导致SyntaxWarning告诉我,输入*只允许在模块级别。所以我真正想要的是处理参数列表并将其转移到其他功能的智能且一致的方式

+0

我一点也不清楚你在问什么。您可以动态创建一个类,例如['type('NewClass',(object,),{})'](https://docs.python.org/3/library/functions.html#type),但为什么你想要? – jonrsharpe

+0

你不会轻易地提及班级及其成员。你正在对抗语言。你想达到什么目的? –

回答

1

您可以使用type动态创建类。如果我明白你想要在这里实现什么,你的代码看起来像:

my_classes = [] 
for i in range(0, len(data), 2): 
    my_classes.append(
     type('A%d' % i,(), {'var1': data[i], 'var2': data[i+1]}) 
    ) 
1

我怀疑你真正想要的,再阅读说明书,就是用type如下:

NewClass = type('NewClass', (object,), dict(zip(symbols, data))) 

给定一个小例子:

>>> symbols = 'foo bar baz'.split() 
>>> data = range(3) 

的结果将是:

>>> NewClass.foo 
0 
>>> NewClass.bar 
1 
>>> NewClass.baz 
2 

使用zip,您可以使用键列表和关联值列表轻松创建字典,您可以将其用作新班级的__dict__

但是,目前尚不清楚为什么您希望这是一个类别,具体而言。

+0

听起来好像可以使用[enum](https://docs.python.org/3/library/enum.html)模块。 –

+0

@NoctisSkytower切实可行!尽管没有OP的进一步意见,但很难说清楚。 – jonrsharpe

+0

@NoctisSkytower或[**'namedtuple' **](https://docs.python.org/2/library/collections.html#collections.namedtuple):'namedtuple('NewClass',symbols)(* data )' –