正解は「どちらでもない」というものです。hasattr は機能を提供しませんが、おそらくすべてのオプションの中で最悪です。
動作するため、Python のオブジェクト指向の性質を使用します。OO 分析は決して正確ではなく、しばしば混乱を招きますが、私たちはクラス階層を使用しています。人々はオブジェクトを把握し、優れたオブジェクト モデルは、コーダーが物事をより迅速に、より少ないエラーで変更するのに役立ちます。適切なコードが適切な場所にクラスター化されます。オブジェクト:
- どの実装が存在するかを考慮せずにそのまま使用できます
- 何をどこで変更する必要があるかを明確にする
- 一部の機能への変更を他の機能への変更から分離します。Y を壊すことを恐れずに X を修正できます。
hasattr と isinstance
isinstance または hasattr をまったく使用しなければならないということは、オブジェクト モデルが壊れているか、間違って使用していることを示しています。正しいことは、オブジェクト モデルを修正するか、使用方法を変更することです。これら 2 つの構成要素は同じ効果を持ち、「これを行うにはコードが必要です」という命令的な意味で、それらは同等です。構造的に大きな違いがあります。このメソッドに初めて出会ったとき (または他のことを数か月行った後)、isinstance は、実際に何が起こっているのか、他に何が可能なのかについて、より多くの情報を伝えます。Hasattr は何も「教えて」くれません。
開発の長い歴史により、私たちは FORTRAN や「自分は誰ですか」スイッチがたくさんあるコードから遠ざかりました。オブジェクトを使用することを選択したのは、オブジェクトがコードの操作を容易にするのに役立つことがわかっているからです。hasattr を選択すると機能が提供されますが、何も修正されず、コードは開始前よりも壊れています。将来この機能を追加または変更する場合、不均等にグループ化され、少なくとも 2 つの編成原則を持つコードを処理する必要があります。その一部は「あるべき」場所にあり、残りは他の場所にランダムに散らばっています。まとまるようなものはありません。これは 1 つのバグではなく、hasattr を通過する実行パスに点在する潜在的なミスの地雷原です。
したがって、選択肢がある場合、順序は次のとおりです。
- オブジェクト モデルを使用するか、それを修正するか、少なくとも問題点と修正方法を突き止めます。
- インスタンスを使用
- hasattr を使用しないでください