問題タブ [abstract-base-class]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 抽象基底クラス:抽象メソッドの独自の実装の後に標準アクションを追加する方法は?
FooBC
データクラスの抽象基底クラスを実装するために必要なボイラー プレート コードを削減したいと考えています。ABC が行う必要があること:
- すべての継承者は、(たとえば) float とは少し異なる方法で作成されます。そのため、それぞれが
from_float()
クラス メソッドを実装する必要があります。 - ただし、すべての継承者は を保存する必要があります
float_value / 2
。これを自動化するにはどうすればよいですか?float_value / 2
現在、ユーザーはの実装ごとに貼り付けを行う必要がありfrom_float()
ます。
今、これは私のコードです:
Inheritor ボイラー プレートを次のように減らしたいと思います。
float_value/2
が呼び出されるたびに自動的に保存されるように FooBC クラスをアップグレードするにはどうすればよいfrom_float
ですか?
私はこのようなものが素晴らしいと思います:
python - 抽象基本クラスをdictサブクラスとのミックスインとして使用することは可能ですか?
TL;DR: 抽象基本クラスを希望する方法でミックスインとして使用できるかどうか、または私のアプローチが根本的に間違っているかどうかを知りたいです。
私が取り組んでいるFlaskプロジェクトがあります。プロジェクトの一環として、RememberingDict
クラスを実装しました。これは の単純なサブクラスでありdict
、いくつかの追加機能が追加されています: 作成時刻を記憶し、自分自身をピクル化/ディスクに保存する方法を知っており、ディスクから自分自身をオープン/アンピクルする方法を知っています:
このコードは、ローカル開発サーバー上で私の目的のために非常にうまく機能するので、すべて問題ありませんが (ここで説明する必要がない理由から)、Google App Engine にデプロイするときには機能しないため、それらの目的のために、私はこの代替実装を設計しました:
現在、これらの実装は両方とも正常に機能しています。ただし、両方を保持したい-最初のものは開発に役立ちます-しかし、厄介なことは、明らかに2つの間にかなりの量の繰り返しがあることです。それらの__init__()
機能は同一です。どちらにもto_disk()
、インスタンスをファイルに保存して返すメソッドがありますNone
。どちらもfrom_disk()
、ディスクのどこかに保存されているクラスのインスタンスを返す classmethod を持っています。
理想的には、それらの両方を基本クラスから継承させたいと考えています。これにより、さまざまな機能が渡され、完全な実装を提供するためにメソッドとメソッドをオーバーライドする必要があるdict
ことも指定されます。to_disk()
from_disk()
ABC
これは、 s が解決できるはずの問題のように感じます。私は次のことを試しました:
ただし、 をABC
(唯一の基本クラスとしてではなく) ミックスインとして使用すると、@abstractmethod
デコレーターが混乱するように見えます。そのため、継承されたクラスは、必要な抽象メソッドの実装に失敗した場合に例外を発生させなくなります。
理想的には、基本クラスが標準の Python のすべての機能を継承するようにしたいのですが、dict
インスタンスをインスタンス化するために継承されたクラスに特定のメソッドを実装する必要があることも指定します。
私がやろうとしていることは可能ですか、それとも私のアプローチは根本的に間違っていますか?
(余談ですがABC
、Web アプリなどのデータ構造をキャッシュする最良の方法よりも、 s の動作方法に関心があります。データをキャッシュするより良い方法があると確信していますが、これは私の最初の Flask プロジェクトであり、現時点では私の方法はうまく機能しています。)