Python初学者:使用循环创建具有动态属性的动态类对象

Python初学者:使用循环创建具有动态属性的动态类对象,python,Python,我试图创建一些通过类动态定义的简单对象,以允许我快速迭代创建这些对象的所有可能性 class NSObjects: def __init__(self, shape, position, shading): self.shape = shape self.position = position self.shading = shading def __str__(self): return '{} - {} - {

我试图创建一些通过类动态定义的简单对象,以允许我快速迭代创建这些对象的所有可能性

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不存在。为此,您可以假设我已经在代码的其他地方定义了从0、1或2开始的所有init变量。我基本上是在尝试创建一系列对象,这些对象将具有由数学公式定义的属性


提前感谢您提供的任何帮助(我几周前才开始编写代码,所以这可能是一个非常愚蠢的问题!)

您只分配给了
obj_1_I
,而不是
obj_1_2
,并且它是函数的本地属性。Python无法判断
\u i
是作为一个单独的变量,而不是较长的变量名的一部分。要快速修复,请尝试更换
obj_1_i=
parts with
globals()[f'obj_1_{i}]=


但是像这样将数字索引滚动到变量名(
\u1\u2
)是一种代码味道。更好的设计是将它们实际用作数据结构的索引,如列表或dict

例如,定义
obj={}
在顶层(任何类或函数之外)


然后你可以用
obj[1,2]
等替换
obj[1,2]
任何地方的
obj[1,i]
等。如果你这样写的话,
obj[1,i]
在那些for循环中会像你期望的那样工作。

你只分配过
obj\u 1\u i
,而不是
obj\u 1\u 2
,并且它是函数的本地属性。Python无法判断
\u i
是作为一个单独的变量,而不是较长的变量名的一部分。要快速修复,请尝试更换
obj_1_i=
parts with
globals()[f'obj_1_{i}]=


但是像这样将数字索引滚动到变量名(
\u1\u2
)是一种代码味道。更好的设计是将它们实际用作数据结构的索引,如列表或dict

例如,定义
obj={}
在顶层(任何类或函数之外)


然后你可以用
obj[1,2]
等替换
obj\u 1\u 2
无处不在。如果你这样写的话,
obj[1,i]
在那些for循环中会像你期望的那样工作。

谢谢!这很有道理-我需要所有我能得到的风格技巧!谢谢这很有道理-我需要所有我能得到的风格技巧!