2017-07-07 21 views
1

私はPythonで、与えられたパラメータの正しいクラスをインスタンス化してこのインスタンスを返すので、Javaのファクトリと同じように動作するはずの関数を書きました。関数の内部クラスのPythonオブジェクトインスタンスを返す

関数内だけ一つのクラスとの最小の例は、これを次のようになります。私は、外部からこの関数を呼び出すときに、私は完璧にこのオブジェクトを使用することができ

def create_object(param): 

    class SpecialClass(ParentClass): 
     def func(self, param): 
      doSomething() 

    class_instance = SpecialClass(param) 
    return class_instance 

。 Javaの背景から来て、私はこれがPythonの動的型付けと関係があると考えていますが、なぜこれが実際に動作するのかまだ分かりません。そのクラスが関数自体の中で知られているスコープではないのですか?

+0

質問が不明です。なぜ*それは動作しませんか?動的タイピングとは何か関係がありますか? –

+0

さて、動的タイピングとは何が関係していますか?また、@DanielRosemanは、彼はJavaで、クラス内のオブジェクトのスコープと関数内のオブジェクトがthr内にあることを意味します...しかし、Florianはここではそうではないようです。 –

+1

私はまだ見ることができませんこれはスコープと何が関係していますか?関数からオブジェクトを返すと、たとえJavaであっても、そのオブジェクトを好きな場所に渡すことができます。 –

答えて

3

あなたの質問に答えるために、オブジェクトが返され、元のクラスがどこに定義されていたかにかかわらず、Pythonはそれを使用できるようにします。 Pythonにはプライベートクラスはなく、関数自体はオブジェクトなので、基本的にオブジェクトを返すと、その関数の外にあるすべてのオブジェクトは、create_object.SpecialClassというインスタンスとしてオブジェクトを参照します。

実際には、工場はあなたがPythonで作ったものではありません。クラスのインスタンスを返すだけのクラスメソッドを使用する必要があります。あなたはそれについてもっと読むことができます:https://docs.python.org/3/library/functions.html#classmethod

もしあなたがちょうどGoogleのpython classmethod decoratorと混乱している場合は、それらを使用する方法のいくつかの良いStackoverflowの説明があります。

+0

これは彼が尋ねたことではありません。彼はそれが自分がやったこと、つまりスコープが制限されている内部クラスのオブジェクトを使っていることを知りたがっています。なぜ行動? –

+0

@AakashVerma、私はそれを説明するために更新しましたが、私はまだそれがunpythonicであるとして工場を作ることからの落胆を維持しています –

+0

私はこれを聞いて期待して半分だったと私は実際にあなたが私に言ったことをうれしく思います。ファクトリ関数を取り除いている間にコードを変更して読み込み可能になったかどうかを確認します。残りについては、これが私の質問に答えると思います。ありがとう! – Florian

-2

言い訳私のひどいJavaは、私はあなたのPythonコードは、これとは何が違うのですかを確認することはできません。

ここで私は、そのクラスがこれまでにすることなく、クラスInnerClassのオブジェクトを参照するメインクラスで
class NestedScope { 
    public static void main(String[] args) { 
     OuterClass oc = new OuterClass(); 
     oc.bar().foo(); 
    } 
} 

class OuterClass { 
    class InnerClass { 
    public void foo() { 
     System.out.println("in here"); 
    } 
    } 
    public InnerClass bar() { 
    return new InnerClass(); 
    } 
} 

スコープ、私は正常にそのfoo()メソッドを呼び出すことができます。

+0

私は、違いが正しい場合は、そのメソッドを経由することなく直接foo()を呼び出すことはできません。これは、NestedScopeクラスがそれを知らない場合、InnerClass型のオブジェクトを宣言することができないためです。そのためには、InnerClassもインポートする必要があります。しかし、私はPythonで(私はできないと思う?)私の関数内でそのクラスをインポートすることはできませんでした。 はい、私は違いを見ます。 – Florian

+0

あなたのコードは[ここ](https://ideone.com/eOE5iW)で動作しますが、私たちが話していたものとはまったく異なります。関数の外にある外部クラスの関数の内部にあるクラスのオブジェクトを作成することは、あなたのコードでは説明されていません。それは起こることはありません。あなたのコードは、クラスが同じ上位クラスの関数の中にないときに、内部クラスのオブジェクトを作成して関数を介して返すことに関するものです。関数の中に存在するクラスのオブジェクトを外部に作成しない。 –

+0

関数内でクラスのオブジェクトを作成する必要がある場合は、同じ関数内でクラスを作成する必要があり、渡すことはできません。その内部クラスを使用して、外部クラスのフィールドへのゲッターを作成し、オブジェクトを作成してゲッターを呼び出すことができます。このすべては、内部クラスが存在する関数の内部で発生します。 –

関連する問題