如何为多个对象设置不同的属性Python

时间:2019-04-10 20:39:46

标签: python python-3.x class

我试图创建一个类的10个实例,但是我想知道是否有一种方法可以一遍又一遍地设置所有对象的属性,因为它看起来并不好。我想为每个实例设置不同的属性。这是我的代码当前正在执行的示例。

from file import MyClass

L = [MyClass() for x in range(10)]

L[0].SetAttribute1('...')
L[0].SetAttribute2('...')
L[0].SetAttribute3('...')
L[0].SetAttribute4('...')
L[0].SetAttribute5('...')
L[0].SetAttribute6('...')

...

L[9].SetAttribute1('...')
L[9].SetAttribute2('...')
L[9].SetAttribute3('...')
L[9].SetAttribute4('...')
L[9].SetAttribute5('...')
L[9].SetAttribute6('...')

3 个答案:

答案 0 :(得分:3)

MyClass应该定义用于设置属性的__init__方法,以便您可以定义诸如MyClass(..., ..., ..., ..., ..., ...)之类的实例。然后,您可以不使用列表理解来定义列表,而是使用更简单的列表文字来定义列表。

L = [
    MyClass(...),
    MyClass(...),
    ...,
    MyClass(...)
]

您可以编写如下内容。除了将所有参数都放在一个地方之外,它所做的不多,但是您可能会发现它很有用。

L = [MyClass() for x in range(10)]

# Hard-coding each name, since I doubt there's any real pattern
# to the names
methods = ["SetAttribute1", ..., "SetAttribute6"]

# All the arguments
all_args = [
    (a1, a2, ..., a6),  # for object 1
    (b1, b2, ..., b6),  # for object 2
    ...,
    (j1, j2, ..., j6),  # for object 10
]

for obj, args in zip(L, all_args):
    for m, arg in zip(methods, args):
        getattr(obj, m)(arg)

zip产生一个类似于[(L[0], (a1, a2, ..., a6)), ..., (L[9], (j1, j2, ..., j6))]的列表。假设obj == L[0]m == "SetAttribute1"arg=a1,行getattr(obj, m)(arg) == getattr(L[0], "SetAttribute1")(a1) == L[0].SetAttribute(a1)

有关zipgetattr的更多信息,请参见Python文档。

答案 1 :(得分:1)

您可以将属性放在列表中,然后将它们设置为循环。

attributes = [['foo', 'bar', 'baz'], ['qux', 'quux', 'quuz'], ['corge', 'grault', 'garply']]

for i, attr_list in enumerate(attributes):

    L[i].SetAttribute1(attr_list[0])
    L[i].SetAttribute2(attr_list[1])
    L[i].SetAttribute3(attr_list[2])

答案 2 :(得分:-1)

如果列表中所有实例的每个属性都相同,则使用循环。如果它们不同,则将值存储在文件或数据库中,然后使用循环读取数据。