2016-07-31 5 views
0

私はPython(3)でゲームを作成しています。メインループにはゲームループとその中に変数があります。私はこの "path"オブジェクトを作成するためのサブクラスを持って、私はメインクラスから変数が必要です。また、メインのスーパークラスからサブクラスを呼び出す必要があります。サブクラスを呼び出すたびに、メインクラスのinitメソッドを呼び出して変数を渡します。この問題が発生すると、メインクラスのすべての変数の値がリセットされます。SuperclassからSubclassオブジェクトを呼び出すにはどうすればよいですか? (Python 3)

class Main: 
    def __init__(self): 
     foo = 0 
     sub1 = Sub() 

    def foo_edit(self): 
     self.foo += 5 

    def main(self): 
     sub2 = Sub() 


class Sub(Main): 
    def __init__(self): 
     super(Sub, self).__init__() 
     self.bar = 0 

    def foo_edit(self): 
     self.foo += 10 

私は多くの他の同様の質問を見てきましたが、私には私に必要な答えはありませんでした。私はのメイン関数の中で私のコードでsub1を試しましたが、のinit関数は互いに永遠に呼び出すので、これは再帰ループエラーを生成します。私がgameloop(またはこの例ではmain)で呼び出すと、呼び出されるたびにMainを初期化し、Subで必要な変数を消去します。私はクラスの必要がなく、機能を持っていたので、私は "パス"の1つのインスタンスを持っていた前に。これで、複数の "path"オブジェクトが必要になりました。必要な変数を得るためにmainのサブクラスを使用しています。

私の質問(スーパークラスからサブクラスを呼び出すことは悪い考えかもしれません)に答える、または答えないこの問題の解決策は、評価されるでしょう。前もって感謝します。

編集: "Sub"クラスに必要な変数を渡すことができましたが、更新する必要があるため、渡された変数がSubで変更されていることを確認するための更新メソッドが必要ですメイン。これは簡単に実行できますが、もっと簡単にやる方法があればいいと思っていました。

+1

'Main'から継承における目的は何だ、それは持って考えると? 'Main'という名前は、それがメインプログラムであることを意味します。 2つの「主な」プログラムを持つことは理にかなっていません。 –

+0

@BryanOakleyこれは2つのメインプログラムではありません。私のゲームでは、パスを作成する関数を持っていましたので、xパスを作ってパスクラスを作って、パスクラスのxオブジェクトを作ることができます。メインクラスの変数から計算を行う必要があります。そのため、メインから継承します。 –

+1

あなたの例は理解するのが難しいです。どちらのクラスも実際に何もしないからです。あなたは 'sub'が必要だと言っていますが、あなたのクラスはそれで何もしません。なぜあなたのクラスはそれ自身のサブクラスのインスタンスを必要としますか? 'Main'のすべてのインスタンスが' Sub'のインスタンスを必要とし、 'Sub'が' Main'のインスタンスである場合、 'Sub'のすべてのインスタンスは' Sub'のインスタンスを必要とします。これは再帰的ただ概念的に。 'Sub'がメインクラスの変数を必要とする場合、' Main'を継承するために 'Sub'が必要なわけではありません。 'Main'インスタンスが自身を' Sub'メソッドに渡すことができます。 – BrenBarn

答えて

2

あなたはサブクラスの目的を誤解しています。継承はデータを共有するためのものではなく、一般的な型の特殊なケースを作るためのものです。

Subは、専門化を少し進めてMainと正確に一致する必要があります。継承を使用する必要があります。 "Sub"が "Main"のサブクラスであると言うとき、 "Subはメイン"であり、 "Subはメインの一部を使用しません"と言います。

SubMainのデータにアクセスすればよい場合は、例えばMainからSubニーズデータならば、SubMainのインスタンスを渡し、Subは、インスタンス上で動作してい

:。

class Main(): 
    def __init__(self): 
     self.foo = 42 
     self.sub1 = Sub(self) 
     self.sub1.foo_edit() 
    ... 

class Sub(): 
    def __init__(self, main): 
     self.main = main 

    def foo_edit(self): 
     self.main.foo += 10 
+0

ありがとう、これは大いに役立ちます。私はオブジェクト指向に慣れていないので、概念を完全に理解していません。私はサブクラスが親クラスからのメソッドと変数を継承していたことを知っていました。私の限られた知識からは、変数を別のクラスに渡す最善の方法のようでした。 –

+0

私はこの解決策について1つの質問があります。 Subオブジェクトが作成された後にMainからの変数が変更された場合、それはSubクラスで更新されますか? Mainの現在の状態はSubクラスに反映されますか? –

+0

@ TheTesseract'sShadow:Subクラスには存在しないため、Subクラスでは更新されません。これはMainクラスに存在し、Mainクラスへの参照を持つものは変更された値への参照を持ちます。したがって、変更はSubクラスの_in_ではなく、Subクラスの_visible_になります。 –

関連する問題