猿问

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

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


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 开始。我基本上是在尝试创建一系列具有数学公式定义的属性的对象。


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


饮歌长啸
浏览 244回答 1
1回答

偶然的你

您只分配给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 循环中工作。
随时随地看视频慕课网APP

相关分类

Python
我要回答