在生成器中设置类属性值

时间:2013-10-31 04:27:29

标签: python python-3.3

我有一份清单清单。每个子列表包含自定义类的对象。我想要做的是将每个类对象的某个属性设置为0.执行此操作的简单方法是双循环或类似:

for subl in L:
  for myObj in subL:
    myObj.attr = 0

或者,我可以使用itertools.chain

for myObj in itertools.chain.from_iterable(L):
  myObj.attr = 0

但是,我想知道我是否可以将所有内容都放在一行中。我是否可以使用类似发电机的结构来做到这一点?有点像:

(myObj.attr=0 for subl in L for myObj in subl)

现在这不会真正起作用,并且会引发一个SyntaxError,但是甚至可能有类似的东西吗?

1 个答案:

答案 0 :(得分:1)

这是一个突然出现的简单解决方案。

使用内置setattr,您的建议 - itertools.chain.from_iterable - 以及滥用列表理解:

class Foo():
    def __init__(self):
        my_attr = 10
A = Foo()
B = Foo()
C = Foo()
D = Foo()

obj_list = [[A, B], [C, D]]
a = [setattr(obj, "my_attr", 0) for obj in itertools.chain.from_iterable(obj_list)]

结果:

>>> a
[None, None, None, None]
>>> A.my_attr
0
>>> B.my_attr
0
>>> C.my_attr
0
>>> D.my_attr
0

我发现setattr对于这样的案例非常有用,它简单,简短,有效。

希望这有帮助!