[解決済み】Pythonで抽象基底クラスを使用する理由は?
質問
私はPythonの古いダックタイピングの方法に慣れているので、ABC(抽象ベースクラス)の必要性を理解できません。その ヘルプ は、その使い方がよくわかります。
の根拠を読もうとしたのですが
PEP
しかし、それは私の頭の上を通り過ぎた。もし私がミュータブルシーケンスコンテナを探しているのであれば、以下のものをチェックすることになるでしょう。
__setitem__
を使うか、あるいはそれを使おうとする可能性が高い(
EAFP
). を実際に使う場面には遭遇していません。
数字
モジュールは、ABCを使用していますが、これが私の理解に最も近いものです。
どなたかその根拠を説明していただけませんか?
どのように解決するのですか?
ショートバージョン
ABCは、クライアントと実装されたクラスとの間に、より高度な意味的契約を提供する。
ロングバージョン
クラスとその呼び出し元との間には契約があります。クラスは、あることを行い、ある特性を持つことを約束します。
契約にはさまざまなレベルがあります。
非常に低いレベルでは、契約にはメソッドの名前やパラメータの数が含まれるかもしれません。
静的型付け言語では、この契約は実際にはコンパイラによって強制されます。Pythonでは EAFP または型イントロスペクションによって、未知のオブジェクトがこの期待される契約を満たしていることを確認します。
しかし、契約にはより高度な、意味上の約束もある。
例えば
__str__()
メソッドは、オブジェクトの文字列表現を返すことが期待されています。それは
かもしれない
オブジェクトのすべてのコンテンツを削除し、トランザクションをコミットし、プリンタから白紙のページを吐き出す...しかし、それが何をすべきかという共通の理解があり、Pythonのマニュアルに記載されています。
それは特殊なケースで、意味上の契約はマニュアルに記述されています。 この場合
print()
メソッドは何をするのでしょうか?オブジェクトをプリンタに書き出すべきなのか、画面に一行書き出すべきなのか、それとも別の何かなのか?それは場合による - ここでの完全な契約を理解するには、コメントを読む必要があります。クライアントコードの一部で、単に
print()
メソッドが存在することを確認したのであって、そのメソッド呼び出しが可能であることを確認したのであって、その呼び出しの上位レベルのセマンティクスについて合意したわけではありません。
Abstract Base Class (ABC) を定義することは、クラスの実装者と呼び出し側との間の契約を作り出す方法です。これは、単なるメソッド名のリストではなく、それらのメソッドが何を行うべきかという理解を共有するものです。この ABC を継承した場合、コメントで説明されているすべてのルール、つまり、メソッドのセマンティクスを含む
print()
メソッドを使用します。
Pythonのダックタイピングは、静的型付けに比べて柔軟性で多くの利点がありますが、すべての問題を解決できるわけではありません。ABCはPythonの自由形式と静的型付け言語の束縛と規律の間の中間的な解決策を提供します。
関連
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
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 call matlab メソッドの詳細
-
Python百行で韓服サークルの画像クロールを実現する
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Python 入出力と高次代入の基礎知識
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] データ型が理解できない
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない