如何使用 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 会自动为您处理。
我正在尝试使用来自集合模块的 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 会自动为您处理。