假设我有一个 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