我有一个扩展列表对象的类,看起来合适,因为它是一个列表,该类还有两个布尔属性,用于过滤返回值。
我能够填充调用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很陌生,所以我不确定即使我可以做到这一点。
答案 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)