我正在尝试创建一些通过类动态定义的简单对象-使我可以快速创建这些对象的所有可能性。
class NSObjects:
def __init__(self, shape, position, shading):
self.shape = shape
self.position = position
self.shading = shading
def __str__(self):
return '{} - {} - {}'.format(self.shape(), self.position(), self.shading())
def NSGenerator_1():
for i in range (0,3):
obj_1_i = NSObjects(shape_init_top + i, posn_init_top+i, shading_init_top+i)
for i in range (3,6):
obj_1_i = NSObjects(shape_init_mid + i, posn_init_mid+i, shading_init_mid+i)
for i in range (6,9):
obj_1_i = NSObjects(shape_init_mid + i, posn_init_mid+i, shading_init_mid+i)
NSGenerator_1()
print(obj_1_2)
此刻,它告诉我obj_1_2不存在。为此,您可以假设我已将所有init变量定义为以代码中其他位置的0、1或2开始。我基本上是在尝试创建一系列具有数学公式定义的属性的对象。
在此先感谢您能提供的任何帮助(我才在几周前才开始编码,所以这可能是一个非常愚蠢的问题!)
答案 0 :(得分:2)
您仅分配给obj_1_i
,而不分配给obj_1_2
,它是函数的本地变量。 Python无法判断_i
是一个单独的变量,而不是较长变量名的一部分。为了快速解决,请尝试更换
obj_1_i =
与globals()[f'obj_1_{i}'] =
部分。
但是将数字索引滚动到诸如(_1_2
)这样的变量名中是一种代码味道。更好的设计是实际上将它们用作数据结构(如列表或字典)的索引。
例如,定义
obj = {}
位于顶层(任何类或函数之外)。
然后,您可以将obj_1_2
替换为obj[1, 2]
等,如果以这种方式编写它们,
obj[1, i]
可以在for循环中按预期工作。