如何使用 python collections.deque 个自定义 class 实例?

How to work with a python collections.deque of custom class instances?

我正在尝试使用来自集合模块的 python 双端队列,其中双端队列中的元素是自定义 class 实例。我想知道如何 erase/delete 一个对象?如果可以,我可以使用像 deque.remove(element) 这样的内置方法吗?如何使用?它如何找到我的自定义对象?

class Buffer(object):

    """ """
    def __init__(self, name, size_total, size_in_cache):
        self.name = name
        self.size_total = size_total

 class Storage(object):
    """
    """
    def __init__(self, capacity):
        self.CAPACITY = capacity
        self.contents = collections.deque()
        self.capacity_used = 0      

    def push_to_contents(self, buffer_name, buffer_size):
        buf = Buffer(buffer_name, buffer_size)
        self.contents.appendleft(buf)

    def delete_from_contents(self, buffer_name)
        """ HOW??
        How can I use self.contents.remove() here>      
        """

collections.deque.remove 的操作方式是将参数与双端队列中的每个项目进行比较。如果它找到等于参数的东西,它会删除它。否则,它会引发 ValueError.

由于 Buffer 对象,正如您所实现的那样,不知道如何将自身与其他对象进行比较,Python 默认值(使用 object 父对象 class) 来比较 id 值。

但是,如果您要为您的 class 实施 __eq__ 方法,您可以完成您正在寻找的东西。

例如,

def __eq__(self, other):
    if isinstance(other, Buffer):
        return self.name == other.name and self.size_total == other.size_total
    elif isinstance(other, str):
        return self.name == other
    else:
        return NotImplemented

编辑:

如果您使用 Python 3,这一切都很好。在 Python 2 中,您还必须实现 __ne__ ("not equal")。可以简单到

def __ne__(self, other):
    return not self == other

Python 3 会自动为您处理。