2013-10-24 164 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在上面插图的目的。