2013-10-24 163 views
-3

我對Python相對來說比較新,並且問自己是否可以創建在函數內動態創建名稱的類?如何動態創建類

代碼:

def create_dummy_elements(): 
    rows = [A,B,C,D,E,F,G,H,I] 
    columns = [A,B,C,D,E,F,G,H,I] 

    for r in range (rows): 
     for c in range (columns): 
      ***** = element(1,1,1,False) 

我的結果應該是一流的 「元素」 命名喜歡AA制的81個物體,AB,AC,AD,... *就是我實實在在的。 ..

+0

你想創建一個與文件中的類的Python文件?或者你想創建該類的不同實例? – jramirez

+2

建立一個由你想要的名字索引的'element'字典會更簡單。然後一旦建立起來,你就可以說例如'elems ['AA']'來獲得'AA'元素。 – atomicinf

+2

你的例子並沒有說明這部分「創建類名稱動態創建一個函數」 – oleg

回答

1

您可以製作這些對象的列表,但它不是動態創建變量名稱的理想選擇。

事情是這樣的:

my_list_of_elements = [] 
for r in range (rows): 
    for c in range (columns): 
     my_list_of_elements.append(element(1,1,1,False)) 

然後你就可以通過索引號來訪問它們,例如:my_list_of_elements[n]

或以匹配循環二維風格,你有:

my_list_of_elements = [] 
for r in range (rows): 
    temp = [] 
    for c in range (columns): 
     temp.append(element(1,1,1,False)) 
    my_list_of_elements.append(temp) 

然後你可以做my_list_of_elements[i][j]來訪問第i行和第j列。

如果你喜歡一個字符串索引,字典將使你:

my_dict_of_elements = {} 
for r in range (rows): 
    for c in range (columns): 
     my_dict_of_elements["element"+(r*c+c)] = element(1,1,1,False) 

,這將給你訪問這樣my_dict_of_elements["element0"]例如。

通過對這個職位在註釋如前所述atomicinf,則可以使用globals()快譯通,但似乎我們都同意有更好的做法。

+2

那麼,您可以動態地創建變量名稱(使用'globals()'dict),但是真的沒有理由這樣做。 – atomicinf

+0

哦,忘了那件事,我會解決我的措辭,但我不認爲我會建議,當你可以只使用數據結構。 –

1

我覺得你可以可以創建列表的建議farmerjoe,但如果你真的想namespases添加到全局的,你可以不喜歡它

class element(object): 
    def __init__(self, *args): 
     self._args = args 
    def __repr__(self): 
     return ' '.join(map(str, self._args)) 


rows = ['A','B'] 
columns = ['A','B'] 

for r in rows: 
    for c in columns: 
     exec('%s%s = element(r,c,False)' % (r,c)) 

print AB 

輸出將是

A B False 
+1

用這種方式,我覺得自己正在處理一隻猴子的手榴彈:)社區如何看待關於newbee問題的成熟答案? – alko

+0

而不是'exec',你可以簡單地使用'globals()[r + c] = element(r,c,False)'。或者更好的是,創建一個對全局變量的引用(以避免重複調用它,比如'_globals = globals()'),然後使用'_globals [r + c] = blah blah blah'。 –

+0

這裏有一個警告,嘗試globals()[4] = 5與exec('4 = 5') – alko

0

雖然它是可能在Python中動態創建類和命名實例,但這樣做通常是不被接受的。它被認爲是更多的「Pythonic」和雅緻的東西,可以將這些東西的集合存儲在列表或字典等某種容器中,然後在需要時通過索引或鍵訪問它們。下面是可能適用於您的問題:

class Element(object): 
    def __init__(self, name, a=None, b=None, c=None): 
     self.name, self.a, self.b, self.c = name, a, b, c 
    def __str__(self): 
     classname = self.__class__.__name__ 
     return('{classname}(' 
       'name={self.name}, b={self.a}, ' 
       'c={self.b}, d={self.c})'.format(classname=classname, 
               self=self)) 
board = {} # empty dictionary 
for row in 'ABCDEFGHI': 
    for col in 'ABCDEFGHI': 
     name = row+col 
     board[name] = Element(name) # assign a named Element instance 

# sample usage 
board['AB'].a = 42 
print board['AB'] # Element(name=AB, a=42, b=None, c=None) 
board['GD'].c = 'something' 
print board['GD'] # Element(name=GD, a=None, b=None, c=something) 

注:我真的不知道怎麼稱呼大部分Element類的屬性,所以我只是用ab,並c在上面插圖的目的。