python - 如何为多个对象设置不同的属性 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('...')
解决方案
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
。