在不更改Python中的集合类型的情况下将元素添加到集合类型

时间:2014-08-03 02:42:15

标签: python

假设我有一个类可以使用元组,列表,字典或一组其他类型的对象。

这样的事情:

class AbstractClass:
    """An example class"""

    def __init__(self, items=None):
        self.items = items

    def items(self):
        """Returns the items that this instance has"""
        return self.items

现在我想添加一个这样的方法:

def add_item(self, item):
    """Adds item to items"""
    # code goes here

现在我被卡住了。我不想检查项目是否是列表,元组等,然后根据具体情况进行检查(因为它似乎只是单声道),但似乎没有一种方法可行普遍。我还想尝试保留类型,因此我不想将项目转换为列表(例如),然后使用list的方法添加项目(使用items.append(item)items + [item,] )。有什么建议吗?

以下是预期行为的有限示例列表:

列表

a = AbstractClass([1, 2])
a.add_item(4) # a.items now contains [1, 2, 4] in any order

元组

a = AbstractClass((1, 2))
a.add_item(4) # a.items now contains (1, 2, 4) in any order

字典(注意:这个是非常可选的,因为我不希望使用它)

a = AbstractClass({0:1, 2:2})
a.add_item({3:4}) # a.items now should be {0:1, 2:2, 3:4}

注意:这并不是要在实践中使用,我只想测试python动态性的限制

2 个答案:

答案 0 :(得分:0)

您可以这样做,它适用于所有标准集合类型:

def add_item(self, item):
    # You could use append here, and it'd be faster
    temporary_list = list(self.items) + [item]
    self.items = type(self.items)(temporary_list)

这是有效的,因为type(x)返回"类型"那个对象。要提取出实际的类型字符串(" list"," set"," tuple"等),我们必须进行一些字符串操作。然后我们可以构造一个等同于:

的语句
# For lists
self.items = list(temporary_list)
# For sets
self.items = set(temporary_list)
# And so on...
编辑:我不知道为什么我被投票了。 Stackoverflow建议反对downvoting而不解释原因,只是你知道。

答案 1 :(得分:0)

如果您不想使用isinstance(),可以检查您认为可行的方法名称:

def __init__(self, items=None):
    self.items = items
    if hasattr(self.items, 'add'):
        self.add_item = self.items.add
    elif hasattr(self.items, 'append'):
        self.add_item = self.items.append
    else:
        raise Exception("no add method found")