ホームページ >バックエンド開発 >Python チュートリアル >Python クラスでエレガントな等価比較を実現するにはどうすればよいですか?

Python クラスでエレガントな等価比較を実現するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-08 08:44:01538ブラウズ

How to Achieve Elegant Equality Comparisons in Python Classes?

Python クラスで等価性 (「等価性」) をサポートするエレガントな方法

オブジェクト指向プログラミングでは、多くの場合、カスタム クラスのオブジェクト間の等価性チェックを定義することが重要です。 Python では、等価比較と非等価比較のための特別なメソッド eq と __ne__ の実装を通じてこれを可能にします。

確立されたアプローチの 1 つは、dict 属性を比較することです。 2 つのオブジェクト:

class Foo:
    def __init__(self, item):
        self.item = item

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

ただし、次のより単純なものについて考えてみましょう。メソッド:

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return isinstance(other, Number) and self.number == other.number

この簡潔なメソッドは、複雑な dict 比較の必要性を排除し、エレガントな代替手段となります。

さらに、サブクラス化をシームレスに処理し、可換性と互換性を保証します。一貫した等価性チェック:

class SubNumber(Number):
    pass

n1 = Number(1)
n2 = Number(1)
n3 = SubNumber(1)
n4 = SubNumber(4)

print(n1 == n2) # True
print(n2 == n1) # True
print(n1 == n3) # True
print(n1 != n4) # True
print(len(set([n1, n2, n3])))  # 1

ソリューションを完了するには、これが不可欠です一貫性のあるハッシュと一意の識別のために hash メソッドをオーバーライドします:

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        return isinstance(other, Number) and self.number == other.number

    def __hash__(self):
        return hash(self.number)

これは、等価比較に dict を使用するときに発生するハッシュの問題に対処し、信頼性の高いセットの動作を保証し、異なるオブジェクトの一意の識別。

以上がPython クラスでエレガントな等価比較を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。