如何使用自定义类实例的python collections.deque?

问题描述 投票:1回答:1

我正在尝试使用来自collections模块的python deque,其中deque中的元素是自定义类实例。我想知道如何擦除/删除对象?如果可以,我可以使用诸如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>      
        """
python-3.x deque
1个回答
0
投票

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

由于您已经实现了Buffer对象,不知道如何与其他对象进行比较,因此Python默认(使用object父类)比较id值。

但是,如果要为您的类实现__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__(“不等于”)。可以很简单]

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

Python 3会自动为您解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.