[英]Comparing objects in a conditional, Python 3
我的程序中有以下代码,用于将设置追加到列表中,或者如果已经在列表中,请将其删除。 如果设置已经有一个值,则应将其发送到self.commit_setting,如果没有,则传递self.commit_setting。 与删除设置(而不是提交设置)相反,它会撤消设置。
no_color = Gdk.RGBA(red=0.000000, green=0.000000, blue=0.000000, alpha=1.000000)
if setting in self.setting_lst:
self.setting_lst.remove(setting) # if the setting is in the list remove it
# NOTE: get_rgba() returns a Gdk.RGBA object
if self.get_rgba() == no_color: # if value not set then pass
pass
else:
self.undo_setting()
else:
self.setting_lst.append(setting) # add setting to list if not already in it
if self.get_rgba() == no_color: # if value not set then pass
pass
else:
self.commit_setting()
当前,这段代码对我来说很好用,但是我想通过仅使用if而不使用else来简化它,这意味着如果不满足条件,它将永远是else。 我想说:
if self.get_rgba() != no_color:
self.commit_setting()
不幸的是,当我这样做时,即使颜色等于no_color,也会执行self.commit_setting()或undo_setting()。 为什么是这样? 做“!” 运算符不能用于比较对象?
假设self.get_rgba()
和no_color
返回相同类的对象(实例)。 您可以让该类覆盖__eq__
函数,该函数在检查是否相等时会在内部调用,而在__ne__
是否会导致不相等-
def __eq__(self, other):
return self.somethings = other.somethings
def __ne__(self, other):
return not self.__eq__(other)
您也可以只定义其中之一(不必同时定义两者)。
此外,为Python 3.0之前,你也可以还__cmp__
以类似的方式功能,它应该返回-1,如果self
有少值,1个,如果self
有更大的价值和0,如果self
等于other
。
上面的函数__eq__
或__ne__
被称为丰富比较运算符,有关完整列表,您可以检查出丰富的比较运算符
正如@James在他的评论中提到的, if not (self.get_rgba() == no_color):
我可以使用if not (self.get_rgba() == no_color):
使其正常工作。 这很容易做到,而且确实达到了我的期望。 但是我仍然想知道为什么“!=”不起作用,有人解释吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.