我正在为Python编写一个纯粹用于学习目的的Queue
数据结构。这是我的class
。当我比较两个Queue
对象是否相等时,我会出现错误。我认为错误是由于我在__eq__
中没有比较None
引起的。但是我该如何检查None
并相应地return
。实际上,我在幕后使用list
并调用其__eq__
,以为它应该像这里所示那样处理,但它没有。
>>> l=[1,2,3]
>>> l2=None
>>> l==l2
False
这是我的类:
@functools.total_ordering
class Queue(Abstractstruc,Iterator):
def __init__(self,value=[],**kwargs):
objecttype = kwargs.get("objecttype",object)
self.container=[]
self.__klass=objecttype().__class__.__name__
self.concat(value)
def add(self, data):
if (data.__class__.__name__==self.__klass or self.__klass=="object"):
self.container.append(data)
else:
raise Exception("wrong type being added")
def __add__(self,other):
return Queue(self.container + other.container)
def __iadd__(self,other):
for i in other.container:
self.add(i)
return self
def remove(self):
return self.container.pop(0)
def peek(self):
return self.container[0]
def __getitem__(self,index):
return self.container[index]
def __iter__(self):
return Iterator(self.container)
def concat(self,value):
for i in value:
self.add(i)
def __bool__(self):
return len(self.container)>0
def __len__(self):
return len(self.container)
def __deepcopy__(self,memo):
return Queue(copy.deepcopy(self.container,memo))
def __lt__(self,other):
return self.container.__lt__(other.container)
def __eq__(self, other):
return self.container.__eq__(other.container)
但是当我尝试使用上述类进行比较时,我得到了以下结果:
>>> from queue import Queue
>>> q = Queue([1,2,3])
>>> q
>>> print q
<Queue: [1, 2, 3]>
>>> q1 = None
>>> q==q1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "queue.py", line 65, in __eq__
return self.container.__eq__(other.container)
AttributeError: 'NoneType' object has no attribute 'container'
>>>
self.container.__eq__(...)
,而不是直接使用self.container == ...
?此外,我不确定是否推荐使用type
的相等性。子类等情况怎么办? - mgilsonhasattr
来查看other
是否具有container
属性,并依赖于鸭子类型。 - mgilsoninstanceof
能否代替hasattr
呢?我可能有一个名为Stack
的类,其中包含container
属性,对吗? - brain stormisinstance
吗?当然,你可以尝试一下。例如:return isinstance(other, Queue) and self.container == other.container
。 - mgilson