我需要设计支持某种不确定性(或通配符,如果您愿意的话)其组件的对象。这项工作是用 Python 完成的。
考虑下面的类
class C():
def __init__(self, p1):
self.p1 = p1
该属性(property)p1
可以是“x”、“y”、“z”,但有时是“x 或 y”,或任何其他组合。
要求如果 p1
的c1
是 'x' 且 p1
的c2
是“x 或 y”,则 c1 == c2
将返回True
。通过提供适当的 __eq__
可以轻松实现这一点。功能。但是,这些对象还需要存储在集合中,因此我需要提供 __hash__
功能。对于这种情况,您将如何计算哈希函数,例如 c1 == c2
然后hash(c1) == hash(c2)
?
选项 1:对属性进行哈希处理
不好原因如下
c1 = C('x')
c2 = C('x or y or z')
c1 == c2 #True
hash(c1) == hash(c2)#False
您的平等标准不可传递,因此无效:
C('x') == C('x or y') == C('y')
但是
C('x') != C('y')
由于您可以构造一个等于所有其他元素的元素 C('x or y or z or a or ...')
,因此是唯一满足 c1 == c2 ⇒ hash( c1) == hash(c2) 是一个常量,即
def __hash__(self):
return 0
我是一名优秀的程序员,十分优秀!