假设我有一个类可以使用元组,列表,字典或一组其他类型的对象。
这样的事情:
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}
答案 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")