web-dev-qa-db-ja.com

Pythonの2つのオブジェクトの各変数に同じ値が含まれているかどうかを確認する方法はありますか?

の2つのインスタンスがあるかどうかを確認するにはどうすればよいですか

class FooBar(object):
    __init__(self, param):
        self.param = param
        self.param_2 = self.function_2(param)
        self.param_3 = self.function_3()

同一ですか?同一とは、すべての変数で同じ値を持つことを意味します。

a = FooBar(param)
b = FooBar(param)

と思った

if a == b:
    print "a and b are identical"!

これは副作用なしでそれを行いますか?

私の質問の背景はユニットテストです。私は次のようなことを達成したい:

self.failUnlessEqual(self.my_object.a_function(), another_object)
19
Aufwind

==を機能させたい場合は、クラスに__eq__メソッドを実装して、豊富な比較を実行します。

all属性の同等性を比較するだけの場合は、各オブジェクトの__dict__を比較することで簡潔に行うことができます。

class MyClass:

    def __eq__(self, other) : 
        return self.__dict__ == other.__dict__
36
AJ.

任意のオブジェクトの場合、==演算子は、2つのオブジェクトが同じオブジェクトである場合(つまり、メモリ内の同じアドレスを参照している場合)にのみtrueを返します。

より多くの「特注」の動作を取得するには、豊富な比較演算子、この場合は具体的には__eq__をオーバーライドする必要があります。これをクラスに追加してみてください。

def __eq__(self, other):
    if self.param == other.param \
    and self.param_2 == other.param_2 \
    and self.param_3 == other.param_3:
        return True
    else:
        return False

(すべてのパラメーターの比較はここで必要になる可能性がありますが、わかりやすくするために残しておきます)。

パラメータ自体が定義したオブジェクトである場合、これが機能するには、これらのオブジェクトが同様の方法で__eq__を定義する必要があることに注意してください。

注意すべきもう1つのポイントは、上記の方法でFooBarオブジェクトを別のタイプのオブジェクトと比較しようとすると、pythonはのparam、param_2、およびparam_3属性にアクセスしようとすることです。 AttributeErrorをスローする他のタイプのオブジェクト。比較しているオブジェクトが最初にisinstance(other、FooBar)を持つFooBarのインスタンスであることを確認することをお勧めします。状況が発生する可能性があるため、これはデフォルトでは実行されません。異なるタイプ間の比較のためにTrueを返したい場所。

属性エラーをスローしてはならないすべてのパラメーターを単純に比較するためのより適切な方法については、AJの回答を参照してください。

豊富な比較の詳細については、 python docs

3
actionshrimp

LutzによるLearning Pythonによると、 "=="演算子は値の同等性をテストし、ネストされたすべてのオブジェクトを再帰的に比較します。 "is"演算子は、2つのオブジェクトが同じオブジェクトであるかどうかをテストします。メモリ内のアドレス(同じポインタ値)。小さな整数と単純な文字列のキャッシュ/再利用を除いて、x = [1,2]とy = [1,2]などの2つのオブジェクトの値は「==」ですがy "is" xはfalseを返します。2つのfloat x = 3.567とy = 3.567でも同じtrueです。これは、アドレスが異なることを意味します。 、hex(id(x))!= hex(id(y))。

クラスオブジェクトの場合、メソッド__eq __()をオーバーライドして、x = A(1、[2,3])とy = A(1、[2,3])のような2つのクラスAオブジェクトを作成する必要があります。コンテンツの「==」。デフォルトでは、 クラスオブジェクト "==" はidのみとid(x)!= id(y)を比較するため、この場合はx!= yです。要約すると、xが「y」の場合、x == yですが、その逆は当てはまりません。

0
Leon Chang