如何筛选扩展列表对象的类的返回值

时间:2014-05-05 20:21:24

标签: python

我有一个扩展列表对象的类,看起来合适,因为它一个列表,该类还有两个布尔属性,用于过滤返回值。

我能够填充调用self.append的类,该类用于接收列表字典并附加存储该字典内容的类的实例;该类存储特定类的实例列表,非常类似于其他语言的矢量。

以下是示例代码:

data = [
    { 'id': 0, 'attr1': True, 'attr2': False },
    { 'id': 1, 'attr1': False, 'attr2': True },
    { 'id': 2, 'attr1': False, 'attr2': False },
    { 'id': 3, 'attr1': True, 'attr2': True }
]

class MyClass(object):
    def __init__(self, data):
        self.id = data['id']
        self.attr1 = data['attr1']
        self.attr2 = data['attr2']

class MyList(list):
    condition1 = True
    condition2 = True

    def __init__(self, data):
        for content in data:
            self.append(MyClass(content))

这实际上有效,这意味着我得到了一个列表o MyClasses 实例,现在我要做的是如果我在访问列表时将condition1的值更改为False,它应该过滤结果,如这样:

my_list = MyList(data)
for item in my_list:
    print 'id', item.id, 'attr1', item.attr1, 'attr2', item.attr2
# >> id 0 attr1 True attr2 False
# >> id 1 attr1 False attr2 True
# >> id 2 attr1 False attr2 False
# >> id 3 attr1 True attr2 True

my_list.condition1 = False
# Now it should list only the instances of MyClass that has the attr1 set to False
for item in my_list:
    print 'id', item.id, 'attr1', item.attr1, 'attr2', item.attr2
# >> id 1 attr1 False attr2 True
# >> id 2 attr1 False attr2 False

我对Python很陌生,所以我不确定即使我可以做到这一点。

1 个答案:

答案 0 :(得分:0)

您需要覆盖__iter__,例如:

class MyList(list):

    def __init__(self, data):
        self.condition1 = True
        self.condition2 = True
        for content in data:
            self.append(MyClass(content))

    def __iter__(self):
        return (self[i] for i in range(len(self))
                if ((self.condition1 or self[i].attr1) and
                    (self.condition2 or self[i].attr2)))

请注意,我已经制作了condition1一个实例,而不是类,属性;我假设您可以为这些标志设置不同的类的不同实例。

此外,您必须在__eq__上实施MyClass才能将其用于例如my_class in my_list,您可以将MyClass.__init__简化为:

def __init__(self, data):
    self.__dict__.update(data)