[解決済み】オブジェクトのインスタンスを属性で比較し、同等性を確認する
2022-03-30 23:23:54
質問
私はクラス
MyClass
この変数には2つのメンバ変数が含まれています。
foo
と
bar
:
class MyClass:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
このクラスのインスタンスが2つあり、それぞれのインスタンスの
foo
と
bar
:
x = MyClass('foo', 'bar')
y = MyClass('foo', 'bar')
しかし、これらを等しいかどうか比較すると、Python は
False
:
>>> x == y
False
pythonにこの2つのオブジェクトを等しいと思わせるにはどうしたらいいですか?
どのように解決するのですか?
メソッドを実装する必要があります。
__eq__
:
class MyClass:
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
def __eq__(self, other):
if not isinstance(other, MyClass):
# don't attempt to compare against unrelated types
return NotImplemented
return self.foo == other.foo and self.bar == other.bar
これで出力されるようになりました。
>>> x == y
True
を実装することに注意してください。
__eq__
を使用すると、クラスのインスタンスは自動的にハッシュ化できなくなり、 セットやディクテに格納することができなくなります。もしあなたが不変の型をモデル化していないなら(すなわち
foo
と
bar
がオブジェクトのライフタイム内に値を変更する可能性がある場合)、インスタンスをハッシュ化できないままにすることを推奨します。
immutable 型をモデル化する場合は、データモデルフックも実装する必要があります。
__hash__
:
class MyClass:
...
def __hash__(self):
# necessary for instances to behave sanely in dicts and sets.
return hash((self.foo, self.bar))
をループさせるというような一般的な解決策。
__dict__
と値を比較することはお勧めできません。
__dict__
には、比較できない型やハッシュ化できない型が含まれている可能性があります。
注:Python 3 より前のバージョンでは、Python 3 で使用するために
__cmp__
の代わりに
__eq__
. Python 2 のユーザは
__ne__
なぜなら、不等号のための賢明なデフォルト動作(すなわち、等号の結果を反転する)は、Python 2では自動的に作成されないからです。
関連
-
Pythonの非常に便利な2つのデコレーターを解説
-
ピロウズ画像色処理の具体的な活用方法
-
PythonによるExcelファイルの一括操作の説明
-
Python LeNetネットワークの説明とpytorchでの実装
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】C言語で構造体の等価性を比較する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
pythonを使ったオフィス自動化コード例
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】ilocが「IndexError: single positional indexer is out-of-bounds」を出す。
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み] オブジェクトのフィールドからPython辞書を生成する
-
[解決済み] NotImplementedErrorを発生させずにNotImplementedを返す理由