Mask
次のような高速な ID チェックを使用できるようにしたい、やや複雑なデータ型があります。
seen = set()
m = Mask(...)
if m in seen:
...
これは、マスクがハッシュ可能であるため、不変であることを示唆しています。ただし、のバリアントを生成したいのですが、バリアントm
ロジックMask
をカプセル化する場所のようです。これは、私が達成したいことを示す最小限の例です。
class Mask(object):
def __init__(self, seq):
self.seq = seq
self.hash = reduce(lambda x, y: x ^ y, self.seq)
# __hash__ and __cmp__ satisfy the hashable contract §3.4.1)
def __hash__(self):
return self.hash
def __cmp__(self, other):
return cmp(self.seq, other.seq)
def complement(self):
# cannot modify self without violating immutability requirement
# so return a new instance instead
return Mask([-x for x in self.seq])
これは、すべてのハッシュ可能および不変のプロパティを満たします。特殊性は、事実上 Factory メソッドであるものを持っていることですcomplement
。これは、目的の機能を実装するための合理的な方法ですか? SOに関する多くの関連する質問が達成しようとしているように、「悪意のある」変更から保護することにまったく興味がないことに注意してください。
この例は意図的に小さくしているため、seq のタプルを作成することで簡単に解決できます。私が実際に扱っているタイプは、そのような単純なキャストを行う余裕がありません。