0

假设我有一个 Person 类,具有名字、中间名和姓氏属性。我希望能够对 Person 对象执行两种不同类型的相等检查:

  • 基于所有属性的字符串比较完全相等
  • 不矛盾,即“G. Bluth”==“George Oscar Bluth”

我一直在玩弄使用__eq____ne__分开的想法:

Person('g', '', 'bluth') == Person('george', 'oscar', 'bluth')  # False
Person('g', '', 'bluth') != Person('george', 'oscar', 'bluth')  # False

这似乎是一个巧妙的解决方案,但!=并不总是返回相反的结果==让我感到紧张。它被认为是不好的做法吗?我是否应该避免使用运算符而只使用类似的方法consistent(self, other)

示例实现:

class Person(object):
    def __init__(self, first, middle, last):
        self.first = first
        self.middle = middle
        self.last = last
    def __eq__(self, other):
        if type(other) is type(self):
            return self.__dict__ == other.__dict__
        return NotImplemented
    def __ne__(self, other):
        if type(other) is type(self):
            return not (self._compatible(self.first, other.first) and 
                        self._compatible(self.middle, other.middle) and 
                        self._compatible(self.last, other.last))
        return NotImplemented
    def _compatible(self, s, o):
        if s and o:
            if s == o or (len(s) == 1 and s == o[0]) or (len(o) == 1 and o == s[0]):
                return True
            return False
        return True
4

1 回答 1

5

最小惊讶原则:使不精确匹配成为命名方法,而不是重载运算符。重载==完全匹配是可以的,但是重载具有明显之外的语义的运算符可能会引起混淆。多打几个字再写是不是很困难Person("G. Bluth").could_be(Person("George Oscar Bluth"))

于 2013-06-20T17:15:47.383 回答