首页 > 解决方案 > 如何为多个对象设置不同的属性 Python

问题描述

我正在尝试制作我制作的类的 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('...')

标签: pythonpython-3.xclass

解决方案


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)

zip有关和的更多信息,请参阅 Python 文档getattr


推荐阅读