Pythonのデザインパターンアダプタモード、コード、思考、など
#- * -コーディング:UTF-8 - * - #1 著者:宝山 クラスコンピュータ: DEF __init__ (自己、名): self.name = 名 デフ __str__ (自己): 戻り ' {}コンピュータ' .format(自己。名) デフ(自己)を実行します。 復帰は 「プログラムを実行」 クラスのシンセサイザーを: デフ __init__ (自己、名): self.name = 名前の デフ __str__ (自己): リターン "{}シンセサイザー' .format(self.name) デフ(自己)を再生: リターンは、 ' 電子曲演奏された' クラス:人間の デフ __init__ (自己、名): self.name = 名前の デフ __str__ (自己): 戻り値を ' {}人間' .format(self.name) DEF (自己)を話す: リターン ' 挨拶' クラスアダプタ: DEF __init__ (自己、OBJ、adapted_methods): self.obj = OBJ 自己。__dict__ .update(adapted_methods) DEF __str__ (自己): 戻りSTR(self.obj) DEF メイン(): オブジェクト = [コンピュータ(' のAsus ' )] シンセ =シンセサイザー(' ムーグ' ) objects.append(アダプタ(シンセ、辞書(実行 = ))synth.play) ヒト =ヒト(' ボブ' ) objects.append(アダプタ(ヒト、辞書を(実行 = human.speakを))) のために私にオブジェクト: 印刷(' {} {} ' .format(STR(I)、i.execute())) もし __name__ == ' __main__ ' : メイン()
コード出力:
Asusのコンピュータは、プログラムを実行 モーグ・シンセサイザーをされ、電子曲演奏 人間は挨拶ボブ
-------------------------------------------------- ----------------------------------------
我々はそうヒトSynthesizerおよびクライアントクラスインターフェースは、所望と互換性があり、そしてそれらのソースコードを変更せずに試みました。これは素晴らしいです!
すべてのクラスは、プロパティ名を持っている場合あなたが準備して挑戦的な運動があり、問題がある現在の実装では、次のコードは失敗します。
用 I におけるオブジェクト: 印刷(' {} ' .format(i.name))
まず、立場をコーディングすることは、これは理にかなっているが、クライアントのコードのために無意味ですが、クライアントがないもの」「何をフィット」と心配するべきではないのですか?このコードは失敗する理由を考えます適応「このような詳細。私達はちょうど統一されたインタフェースを提供したいです。このコードを有効にするにはどうしますか?
アダプタクラスに含まれるオブジェクトに委ねていない部分を適応させる方法を考えます。
次のように答えは次のとおりです。
以下のアダプタクラスの変更は、コードの行を追加します。
クラスアダプタ: DEF __init__ (自己、OBJ、adapted_methods): self.obj = OBJ の自己。__dict__ .update(adapted_methods) self.name = obj.name DEF __str__ (自己): 戻り STR(self.obj)
その後、次のようにメイン関数の対応する名前を取得
DEF メイン(): オブジェクト = [コンピュータ(' のAsus ' )] シンセ =シンセサイザー(' ムーグ' ) objects.append(アダプタ(シンセ、辞書(実行 = synth.playを))) 、ヒト =ヒト(' ボブ' ) オブジェクト.append(アダプタ(ヒト、辞書(実行 = human.speakを))) のための I におけるオブジェクト: プリント(' {} {} ' .format(STR(I)、i.execute())) プリント( '{} 」.format(i.name)) であれば __name__== ' __main__ ' : main()の
出力:
Asusのコンピュータは、プログラムを実行 Asusの モーグ・シンセサイザーがされ、電子曲の演奏 ムーグ 人が挨拶ボブ ボブ
「熟練したPythonのデザインパターン」:からリファレンス