これは、理論的な部分と実際的な部分の2つの質問です。
dictをサブクラス化する場合:
class ImageDB(dict):
def __init__(self, directory):
dict.__init__(self) # Necessary??
...
dict.__init__(self)
「安全」対策と同じように(たとえば、重要な実装の詳細が重要な場合に)呼び出す必要がありますか?呼び出されdict.__init__()
ない場合、Pythonの将来のバージョンでコードが破損するリスクはありますか?私はここで、どちらか一方を行う根本的な理由を探しています(実際には、電話dict.__init__()
は安全です)。
私の推測では、ImageDB.__init__(self, directory)
が呼び出されたとき、selfはすでに新しい空のdictオブジェクトであり、したがって呼び出す必要はありませんdict.__init__
(最初はdictを空にしたいです)。これは正しいです?
編集:
上記の基本的な質問の背後にあるより実用的な質問は次のとおりです。私は(常にdb.contents […]を実行する代わりに)db […]構文を頻繁に使用するため、dictをサブクラス化することを考えていました。オブジェクトの唯一のデータ(属性)は、実際には実際にはdictです。get_image_by_name()
データベースにいくつかのメソッド(たとえば、、、など)を追加し、get_image_by_code()
をオーバーライドするだけにします__init__()
。これは、イメージデータベースがそれを含むディレクトリによって定義されているためです。
要約すると、(実用的な)質問は次のようになります。初期化が異なり(ディレクトリ名のみを使用する)、追加のメソッドがあることを除いて、辞書のように動作するものの適切な実装は何ですか?
「工場」は多くの回答で言及されました。つまり、すべてを要約すると、dictをサブクラス化し、メソッドをオーバーライド__init__()
して追加しますか、それとも、メソッドを追加するdictを返す(ファクトリ)関数を記述しますか?ファクトリ関数は、追加のセマンティクスとメソッドがあることをタイプが示さないオブジェクトを返すため、最初のソリューションを好む傾向がありますが、どう思いますか?
編集2:
新しいクラスが「辞書ではない」場合、特にその__init__
メソッドがdictと同じ引数を取ることができない__init__
場合(「実用的な質問」の場合)、 dictをサブクラス化することはお勧めできません。その上)。言い換えれば、私が正しく理解していれば、コンセンサスは次のように思われます。サブクラス化する場合、すべてのメソッド(初期化を含む)は基本クラスのメソッドと同じシグネチャを持っている必要があります。これにより、isinstance(subclass_instance、dict)は、たとえば、のsubclass_instance.__init__()
ように使用できることを保証できます。dict.__init__()
次に、別の実用的な質問が表示されます。初期化メソッドを除いて、dictと同じようなクラスをどのように実装する必要がありますか?サブクラス化せずに?これには、面倒なボイラープレートコードが必要になりますね。