ホームページ > バックエンド開発 > Python チュートリアル > Python クラスが本当に等しいことを確認するにはどうすればよいですか: 等価性メソッドのガイド

Python クラスが本当に等しいことを確認するにはどうすればよいですか: 等価性メソッドのガイド

DDD
リリース: 2024-11-08 10:51:01
オリジナル
993 人が閲覧しました

How Can I Ensure My Python Classes Are Truly Equal: A Guide to Equivalence Methods

Python クラスの同等性の維持: 同等性メソッドの包括的なガイド

Python では、eqne の特別なメソッドは、カスタム クラスの等価性を定義する便利な方法を提供します。 __dict__s を比較する基本的なアプローチは実行可能なオプションですが、サブクラスや他の型との相互運用性に関する課題に直面する可能性があります。

より堅牢な等価性処理

これらに対処するには制限があるため、より包括的な実装を検討してください:

class Number:

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

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

    def __ne__(self, other):
        x = self.__eq__(other)
        if x is not NotImplemented:
            return not x
        return NotImplemented

    def __hash__(self):
        return hash(tuple(sorted(self.__dict__.items())))

class SubNumber(Number):
    pass
ログイン後にコピー

このバージョンには以下が含まれます:

  • サブクラス処理: Number クラス間で等価性が適切にチェックされることを保証します。
  • 非可換修正: オペランドの順序に関係なく、等価比較が可換であることが保証されます。
  • ハッシュ オーバーライド:カスタム ハッシュ メソッドを定義することで、同じ値を持つオブジェクトが同じハッシュ値を持つことが保証されます。これは、セットおよびディクショナリ操作にとって重要です。

検証とテスト

このアプローチの堅牢性を検証するために、以下に一連のアサーションを示します。

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

assert n1 == n2
assert n2 == n1
assert not n1 != n2
assert not n2 != n1

assert n1 == n3
assert n3 == n1
assert not n1 != n3
assert not n3 != n1

assert not n1 == n4
assert not n4 == n1
assert n1 != n4
assert n4 != n1

assert len(set([n1, n2, n3])) == 1
assert len(set([n1, n2, n3, n4])) == 2
ログイン後にコピー

これらのアサーションは、等価性メソッドの正しい動作とハッシュ値の一貫性を示しています。

このより包括的なアプローチを採用することで、堅牢な等価性処理を備えた Python クラスを作成し、信頼性の高い比較と正確なセットおよびディクショナリ操作を保証できます。

以上がPython クラスが本当に等しいことを確認するにはどうすればよいですか: 等価性メソッドのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート