如何动态创建类

时间:2013-10-24 21:46:32

标签: python class object dynamic

我对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个对象,命名为AA,AB,AC,AD,... * 是我实际要求的......

3 个答案:

答案 0 :(得分: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()字典,但似乎我们都同意有更好的做法。

答案 1 :(得分: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

答案 2 :(得分: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类的大多数属性,所以我只使用abc以上是为了说明目的。