繁体   English   中英

在条件Python 3中比较对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM