2012-02-25 72 views
2

有没有办法做我想在这里做:迭代对象属性并更改它们?

for item in [self.docket_numbers, self.neutral_citations, 
      self.lower_courts, self.lower_court_judges, 
      self.dispositions, self.judges, self.nature_of_suit]: 
    if item is not None: 
     item = [clean_string(sub_item) for sub_item in item] 

显然,在最后一行,我需要在列表解释的结果分配回对象......但我我不知道如何。

回答

2

如果各个项目清单,其中它看起来像他们,你不需要SETATTR,你可以简单地改变他们就地:

>>> def clean_string(s): 
...  return ''.join(c for c in s if c != '7') 
... 
>>> class Court(object): 
...  def __init__(self): 
...   self.docket_numbers = ["a1", "b277"] 
...   self.dispositions = ["happy", "sad77"] 
...  def clean(self): 
...   for item in [self.docket_numbers, self.dispositions]: 
...    if item is not None: 
...     item[:] = [clean_string(sub_item) for sub_item in item] 
... 
>>> C = Court() 
>>> vars(C) 
{'dispositions': ['happy', 'sad77'], 'docket_numbers': ['a1', 'b277']} 
>>> C.clean() 
>>> vars(C) 
{'dispositions': ['happy', 'sad'], 'docket_numbers': ['a1', 'b2']} 
+0

有时我喜欢SO。感谢您使用我的当前代码添加[:]的快速,详细和梦幻般的答案。你能解释一下吗?我从来没有见过它? – mlissner 2012-02-25 03:46:10

+1

'[:]'表示没有指定开始或结束的片段,这意味着它占用了整个事物。 'a_list [:]'做了一个列表的浅表副本。当分配给该片段时,这意味着你删除了指定片段并将其替换为给定列表,所以'a_list [:] = b_list'将给出'a_list'的所有内容,同时仍保持对象标识'a_list'(这就是为什么你不需要'setattr')。 – 2012-02-25 04:34:28

3

迭代名称;那么你可以使用getattrsetattr

for attr in ('docket_numbers', 'neutral_citations', 
      'lower_courts', 'lower_court_judges', 
      'dispositions', 'judges', 'nature_of_suit'): 
    item = getattr(self, attr) 
    if item is not None: 
     setattr(self, attr, [clean_string(sub_item) for sub_item in item]) 
+0

多一点复杂帝斯曼的回答,但无论如何,谢谢你。教育。 – mlissner 2012-02-25 03:46:31

+1

@mlissner这是更通用的解决方案,因为它不依赖于列表中的项目。 – agf 2012-02-25 03:58:09