2

Python でオブジェクトのリストまたはハッシュを実装する方法を理解しようとしています。より具体的には、私が得ることができる最も近いこの質問で、私はそれを次のようにして見ました:

class MyClass(object):

def __init__(self):
    self.numbers = [1,2,3,4,54]

def __contains__(self, key):
    return key in self.numbers

>>> m = MyClass()
>>> 54 in m
True

クラスで直接演算子を使用して、クラス内の属性をチェックできます

私の質問はこれの延長です。MyClass オブジェクトのリストまたはハッシュがあるとします。

list = [m1,m2,m3]
hash = {m1,m2,m3}

次のようなものを使用したいと思います:

if 54 in list: 
   #do something
if 54 in hash: 
   #do something

in 演算子が機能するために MyClass で定義する必要があるメソッドは何ですか? in が何をするのかわかりません(__eqなどを必要とする==の場合)。そのような場合に .index() を機能させる方法を知っていれば、私も感謝します。

編集:申し訳ありませんが、最初の質問は混乱を招きました。私はそれを明確にしたことを願っています。他の質問の元の例など、クラスの一部である属性を見つけようとしています。しかし今、リストまたはハッシュ内でそうしようとしています。ある意味では、要素がリスト内にあるかどうかを尋ねることで、リストの各要素内にあるかどうかを尋ねます。リストまたはハッシュで演算子を使用することでそれが行われるのか、それとも == を使用して比較されるのかはわかりません。

ありがとうございました。

4

2 に答える 2

4

in封じ込めをテストするとき、カスタム タイプと等しいかどうかがチェックされます。

つまり、次のob in some_sequenceように見ることができます。

any((ob is contained_ob or ob == contained_ob) for contained_ob in some_sequence)

2 つのカスタム クラスob1ob2、次の場合に等しいかどうかをテストします。

  1. それらは同一でob1 is ob2あり、真です。それらは同じオブジェクトです。
  2. メソッドをob1持っている場合は、テストされます。__eq__ob1.__eq__(ob2)
  3. そのob1ようなメソッドは存在ob2.__eq__() しないが存在する場合ob2.__eq__(ob1)は、試行されます。

__ne__()and / orメソッドを定義し__cmp__()てもう少し複雑にすることもできますが、通常は、カスタム型でこれをいじりすぎることは避けたいと考えています。

于 2013-04-17T17:27:21.653 に答える
0

@MartijnPieters が言ったように、__eq__()メソッドをオーバーロードする必要があります。あなたが与えたハッシュ/辞書の例が何を意味するのかわかりません。

class MyClass(object):

    def __init__(self):
        self.numbers = [1,2,3,4,54]

    def __contains__(self, key):
        return key in self.numbers

    def __eq__(self, other):
        if other in self.numbers:
            return True
        else:
            return False


m1 = MyClass()
m2 = MyClass()
m3 = MyClass()

test1 = 54 in [m1, m2, m3]
print test1
#True
test2 = 666 in [m1, m2, m3]
print test2
#False
于 2013-04-17T17:46:49.200 に答える