2015-11-06 146 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 )' –