我对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,... * 是我实际要求的......
答案 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
类的大多数属性,所以我只使用a
,b
和c
以上是为了说明目的。