- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为 python 编写一个 Queue
数据结构,纯粹出于学习目的。这是我的类
。当我比较两个 Queue
对象是否相等时,出现错误。我认为错误会弹出,因为我没有在我的 __eq__
中比较 None
。但是我如何检查 None
和 return
相应地。事实上,我在幕后使用 list
并调用它的 __eq__
,认为它应该像这里所示那样小心,但它没有
>>> l=[1,2,3]
>>> l2=None
>>> l==l2
False
这是我的类(class):
@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'
>>>
最佳答案
您的问题是您如何实现 __eq__
.
看这段代码:
q = Queue([1,2,3])
q1 = None
q==q1
让我们将其重写为等价物:
q = Queue([1,2,3])
q == None
现在,在 Queue.__eq__
我们有:
def __eq__(self, other):
return self.container.__eq__(other.container)
但是other
是None
,这意味着 return 语句正在调用:
self.container.__eq__(None.container)
正如您的错误所述:
'NoneType' object has no attribute 'container'
因为没有! None
没有容器属性。
所以,怎么做,就看你想怎么对待了。现在,很明显,一个 Queue
对象不能是 None
如果已定义,则:
return other is not None and self.container.__eq__(other.container)
如果 other
会延迟计算是None
, 并返回 False
在评估 and
之后的表达式部分之前.否则,它将执行评估。但是,如果 other
,您将遇到其他问题不是 Queue
类型(或者更准确地说,另一个对象没有 container
属性),例如:
q = Queue([1,2,3])
q == 1
>>> AttributeError: 'int' object has no attribute 'container'
所以...取决于您的逻辑,如果 Queue
不能与其他类型“相等”(这只有你能说),你可以像这样检查正确的类型:
return other is not None and type(self) == type(other) and self.container.__eq__(other.container)
但是... None
是 NoneType
, 因此它永远不可能与 Queue
属于同一类型.所以我们可以再次将其缩短为:
return type(self) == type(other) and self.container.__eq__(other.container)
编辑:根据 mglisons 的评论:
这可以通过使用常规的相等语句变得更加 pythonic:
return type(self) == type(other) and self.container == other.container
他们还就 type
的使用提出了一个很好的观点在检查美丽。如果你确定 Queue
永远不会被子类化(这很难说)。您可以使用异常处理来捕获 AttributeError
有效地,像这样:
def __eq__(self, other):
try:
return self.container == other.container
except AttributeError:
return False # There is no 'container' attribute, so can't be equal
except:
raise # Another error occured, better pay it forward
以上内容可能被认为有点过度设计,但从安全性和可重复性的角度来看可能是解决此问题的更好方法之一。
或者使用 hasattr
的更好、更短的方法(我最初应该想到的)是:
return hasattr(other, 'container') and self.container == other.container
关于python - 如何比较 python 自定义类中 None 对象的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20364414/
也许我在 Java 上工作的时间太长而没有真正理解它的一些基础知识。 我确实理解 == 用于对象引用相等,而 .equals() 用于对象值相等。 比较整数: Integer x = 1, y = 1
我是从一道考试题中得出这个答案的,但无法理解该解决方案的工作原理。如果值“x”和“y”相等,则此函数应该返回“true”,否则返回 False。 解决方法: function equal_boolea
我将带有表情符号的文本存储在 mysql 数据库中。 数据库、表和列设置为使用utf8mb4和utf8mb4_unicode_ci。 我可以毫无问题地输入单元格值(数据类型是 VARCHAR)。 但是
如果两个 DateTime 对象具有相同的日、月和年,我该如何比较?问题是他们有不同的小时/分钟/秒。 最佳答案 对于 DateTime 对象,没有好的方法可以做到这一点。所以你必须做,比方说,不是那
我一直想知道这个问题,所以我想我会问的。 您将看到的大多数地方都使用相同的语义逻辑来覆盖 Equals 和 GetHashCode 以实现成员平等...但是它们通常使用不同的实现: publi
苹果 CoreGraphics.framework , CGGeometry.h : CG_INLINE bool __CGSizeEqualToSize(CGSize size1, CGSize s
在最新的python 版本中, dict 保留了插入的顺序。在平等方面是否有任何变化。例如,目前以下工作。既然广告顺序很重要, future 会不会发生这种变化? 我问是因为有根本性的变化 - 以前
class VideoUserModel(models.Model): user = models.ManyToManyField(get_user_model()) viewlist
我在 COQ 中有一个有限枚举类型(比如 T),我想检查元素是否相等。这意味着,我需要一个函数 bool beq_T(x:T,y:T) 我设法定义这样一个函数的唯一方法是逐个分析。这会导致很多匹配语
我在 Windows 7(32 位)下的 MinGW 中使用 gfortran 来编译 Fortran 代码。这是文件 testequal.f 中包含的最少代码: program test
我有以下 jsp 片段: ${campaign.moderated}
我想检查两个稀疏数组是否(几乎)相等。而对于 numpy 数组,你可以这样做: import numpy as np a = np.ones(200) np.testing.assert_array_
我有以下类(class): public class MyDocuments { public DateTime registeredDate; public
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 5 年前。 我在这里想做的是,我采用一个精度值(小于 1)并打印 1/n 类型的所有数字
我正在为我的arduino写一个草图,我想检查我的字符串的最后一个字符。 例如: 如果输入是 cats- 我想看看最后一个字符(在我的例子中是“-”)实际上是否 - 我使用的代码: 串行事件函数 vo
让我们开始: using System; public class Program { class A { public virtual void Do() { }
我只需要根据几个键(不是全部)来确定两个 HashMap 的相等性 除了单独访问每个字段并比较相等性之外,还有其他节省时间的方法吗? 最佳答案 我能想到的一种方法是在您的 HashMap 上存储某种“
在Java中,大写的Double可以为null。 但是如果我有 double a 和 b 并且我这样做: if (a.equals(b)) 如果其中之一为空,它会崩溃。有没有更好的方法来比较它们? 最
我正在尝试从我的旧数据库中插入表格数据。 Id 在数据库表和选择特定列中都相等。这是我的数据库。 旧数据库:sch -> 旧表:product (id, tag, url) (13, red, aaa
我正在开发一个应用程序,它在我的主视图中有一个侧边栏和两个 div。我试图在容器内平均分割两者的高度。我试过 height = 50% 但效果不太好。
我是一名优秀的程序员,十分优秀!