通过类属性访问dicts的列表

时间:2016-06-15 11:40:19

标签: python list class dictionary

我有一个dicts列表,我需要将dicts值作为属性访问。

我的代码:

class Comments:

    def __init__(self):
        self.comments = [{'id': 1, 'title': 'bla'},
                         {'id': 2, 'title': 'bla2'},
                         {'id': 3, 'title': 'bla3'}]

    def __iter__(self):
        return iter(self.comments)

所以,当我写下这样的东西时:

comment_list = Comments()
for comment in comment_list:
    print comment['id']

有效。

但我希望将属性用作comment.id而不是comment['id']

如何实现?

5 个答案:

答案 0 :(得分:4)

正如@Tim Castelijns所说,这并非如何运作。

您所寻求的行为可以通过Comment类来实现,该类将idtitle视为成员。

class Comment

    def __init__(self, id, title):
       self.id = id
       self.title = title

class CommentsHolder:

    def __init__(self):
        self.comments = [Comment(1,'bla'),
                         Comment(2,'bla2'),
                         Comment(3, 'bla3')]

    def __iter__(self):
        return iter(self.comments)

然后你可以这样做:

for comment in CommentsHolder():
    print(comment.id)

此外,您可以查看Bunch module,这是一个可通过点访问的字典。但是,如果您使用的是python 3,请注意它可能无法正常工作。 (至少它不适合我。)

答案 1 :(得分:0)

您可以使用Bunch进行此操作。

  

Bunch是一个支持属性风格访问的字典,是一个la JavaScript

答案 2 :(得分:0)

完整性的另一种方法 - 使用namedtuple

from collections import namedtuple

Comment = namedtuple('Comment', ('id', 'title'))
comments = [Comment(42, 'What is the answer to life, the universe, and everything?'),
            Comment(13, 'What is your favorite color?'),
            Comment(14, 'What is your quest?'),
            Comment(15, 'What is the airspeed velocity of an unladen swallow?'),
            ]

for comment in comments:
    print('{}: {}'.format(comment.id, comment.title))

# or
for comment in comments:
    comment = comment._asdict()
    print('{}: {}'.format(comment['id'], comment['title']))

答案 3 :(得分:0)

您可以创建允许正常访问的字典子类的注释实例以及点状属性样式访问。有几种方法可以实现它,但以下是最简单的方法之一,即使每个实例都有自己的__dict__

class Comment(dict):
    def __init__(self, *args, **kwargs):
        super(Comment, self).__init__(*args, **kwargs)
        self.__dict__ = self

class Comments(object):
    def __init__(self):
        self.comments = [Comment({'id': 1, 'title': 'bla'}),
                         Comment({'id': 2, 'title': 'bla2'}),
                         Comment({'id': 3, 'title': 'bla3'})]

    def __iter__(self):
        return iter(self.comments)

comment_list = Comments()
for comment in comment_list:
    print(comment.id)

请注意,Comment字典可以创建many ways regular dictionaries can中的任何一个,因此除了上面显示的内容之外,comments列表中的实例可能已经像这样使用了用于定义其内容的关键字:

class Comments(object):
    def __init__(self):
        self.comments = [Comment(id=1, title='bla'),
                         Comment(id=2, title='bla2'),
                         Comment(id=3, title='bla3')]

答案 4 :(得分:0)

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

class Comments:
    def __init__(self):
        self.comments = [{'id': 1, 'title': 'bar'},
                         {'id': 2, 'title': 'foo'},
                         {'id': 3, 'title': 'spam'}]

    def __iter__(self):
        return iter(self.comments)

comment_list = Comments()
for comment in comment_list:
    print(AttrDict(comment).id)

AttrDict使用here