我有一种情况,我将有很多列表,每个列表中的值需要在一组有效值中。但是,每个列表的有效值集合将不同。因此,在做任何附加到这些列表之前,我必须检查成员资格,并且这会产生大量重复的代码。我发现自己很想扩展列表对象,以便我不必一遍又一遍地进行会员检查。
class Attribute(list):
def __init__(self,validList):
self.valid = validList
def append(self,inString):
if inString not in self.valid:
raise Exception, '%s is not a valid value for this attribute' % inString
if inString not in self:
super(Attribute,self).append(inString)
这样我可以让每个列表都有一组不同的有效值。但是,我觉得扩展内置对象通常不是一个好主意,我过去一直避免使用它。所以我的问题是
Overriding append method after inheriting from a Python List有助于使此代码有效。
答案 0 :(得分:2)
我猜你可以去任何一种方式,但通常我会避免继承子列表。例如,我可能会创建自己的集合对象而不是子类化。
在您的情况下,我会过滤每个列表以检查成员资格。除非您处理大量记录集,否则可能不是问题。
list.append(1)
list.append(2)
list.append(3)
# list = [1, 2, 3]
valid_values = (2, 3)
list = [item for item in list if item in valid_values]
# list = [2, 3] now
关于为什么追加不起作用的问题,这是因为你试图追加一个列表,而不是一个列表项。您可以通过将其设为list.append(inString)
来解决此问题。如果您希望实际将列表组合在一起,则可以使用list.extend(other_list)
或list + other_list
。
另外,Python中的大多数人都遵循PEP-8语法以提高可读性。这意味着inString
将被命名为in_string
。