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

时间:2018-12-29 06:36:51

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

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

1 个答案:

答案 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循环中按预期工作。