-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)

我的结果应该是类“元素”的 81 个对象,命名为 AA,AB,AC,AD,... *是我实际要求的...

4

3 回答 3

1

我认为你可以按照建议的 farmerjoe创建列表,但如果你真的想将命名空间添加到全局,你可以这样做

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
于 2013-10-24T22:00:32.987 回答
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()dict,但似乎我们都同意有更好的做法。

于 2013-10-24T21:49:52.167 回答
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类的大多数属性,所以我只是在上面使用a,bc来进行说明。

于 2013-10-24T23:51:02.590 回答