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

2024-09-30 08:35:21 发布

您现在位置: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('...')

Tags: 对象实例方法代码from示例属性myclass
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文档

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

你可以把你的属性放在一个列表中,然后在一个循环中设置它们

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])

相关问题 更多 >

    热门问题