2012-01-16 17 views
3

を呼び出す:私はそのクラスのCクラスの定義といくつかの内部クラス定義を持っている別のクラス内のクラスを定義し、親メソッド

class DoXJob(): 
    def __init__(self, param1, param2): 
     <choose an inner class to use> 

    def DoIt(self): 
     pass 

    def Finalize(self): 
     <do finalization> 

    class DoXInSomeWay(): 
     def __init__(self): 
      .... 
      .... 
     def DoIt(self): 
      ... 

    class DoXInSomeOtherWay(): 
     def __init__(self): 
      .... 
      .... 
     def DoIt(self): 
      ... 

ロジックはシンプルですが、私は仕事を処理するために、いくつかの内部クラス定義を持っています、私は、W、全てが微細である

obj = DoXJob(param1, param2) 
obj.DoIt() 

、それは次に内部クラスが使用される決定し、選択された内部クラスメソッド( DoXInSomeOtherWay.DoIt又は DoXInWay.DoIt)の方法で DoXJob.DoItメソッドをオーバーライドするいくつかのパラメータと DoXJobを呼び出します私が欲しいのは、または DoXInWay.DoItから呼び出すような、ineerクラスの DoXJob.Finalizeをトリガーすることです。しかし、私はこれをどのように処理するか、それが正しいかどうかはわかりません。

obj = DoXJob(param1, param2) 
obj.DoIt() 
obj.Finalize() 
+3

インナーを削除して、サブクラスを作成し、異なる方法を上書きしないのはなぜですか? – DonCallisto

+0

代わりに、あなたがしようとしていると思われるもの、つまり戦略パターンに、従来のアプローチをとることができます。 –

+0

@DonCallistoサブクラス化と継承の使用が必要なことはあまりありません。また、内部クラスは基本クラス内でのみ使用されるため、サブクラス化ではなくこのパターンに従うと、より論理的に思えます。 – FallenAngel

答えて

2

は残念ながら、Pythonは親インスタンスを参照する方法を持っていないようです:またはそれが良いようなDoXJobメソッド呼び出しとして作ることです。

代わりに、使用する内部クラスを選択し、おそらくそれをインスタンス化する外部__init__では、外部オブジェクトのselfを内部クラスインスタンスのパラメータとして渡す必要があります。

編集:再設計のテーマを取り上げれば、単にDoItメソッドを呼び出すことができ、その戻りを待つならば、同じ場所(呼び出し元)にFinalizeを呼び出すことができます。インナーがアウターを呼び出すために。

+0

上位レベルのインスタンスを呼び出せません。このような便利な言語のハンドヘルドです。 私のアプローチは、私があなたの編集で提供しているようなものでしょう。私はメソッドのオーバーライドを破棄し、インナークラスのインスタンスを上位クラスの変数に設定し、上位レベルのDoItメソッドからDoItを呼び出します。それはよりクリーンな解決策になります... – FallenAngel

+0

@FallenAngel:私は実際にそれはいくつかの点で良いことだと思う。より厄介なことは、囲むクラスのスコープ内で定義された名前が、内部クラスのスコープ内にないことです(また、指定されたインスタンスではなく、外部クラスオブジェクト上の名前を参照します)。 – Marcin

+0

thats私が言っていることは...私はいくつかの囲むクラス変数にアクセスしたいと思います...しかし、それは不可能なので、変数を内部クラスの "nit'asパラメータに渡すか、または内部クラスインスタンスをいくつかのencolsingクラス変数に設定し、内部クラス関数を呼び出す前に内部クラス変数を定義する必要があります。 – FallenAngel

関連する問題