2016-07-31 17 views
0

Ich erstelle ein Spiel in Python (3) und ich habe eine Hauptklasse mit der Spielschleife und eine Reihe von Variablen drin. Ich habe eine Unterklasse, um "Pfad" -Objekte zu erstellen, und ich brauche die Variablen aus der Hauptklasse. Ich muss auch die Unterklasse von der Haupt-, Oberklasse aufrufen. Jedes Mal, wenn ich die Unterklasse aufrufe, ruft sie auch die Hauptklassen init auf, um Variablen weiterzuleiten. Das Problem ist, wenn dies passiert, setzt es die Werte aller meiner Variablen in der Hauptklasse zurück.Wie kann ich ein Subclass Objekt von einer Superklasse aufrufen und gibt es einen besseren Weg dies zu tun? (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 

Ich habe mir viele andere ähnliche Fragen angesehen, aber keine hat mir die Antwort gegeben, die ich brauche. Ich habe versucht, Sub1 in meinem Code (in der init Funktion von Main) und dies schafft eine Rekursion Schleife Fehler, weil die init Funktionen für immer einander aufrufen. Wenn ich es im gameloop (oder main in diesem Beispiel) anrufe, initialisiert es Main jedes Mal, wenn es aufgerufen wird, und löscht die Variablen, die in Sub benötigt werden. Bevor ich nur eine Instanz des "Pfades" hatte, brauchte ich keine Klasse und hatte eine Funktion. Jetzt, wo ich mehrere "Pfad" -Objekte brauche, benutze ich eine Unterklasse von main, um die Variablen zu bekommen, die ich brauche.

Eine Lösung für dieses Problem, die meine Frage beantwortet oder nicht beantwortet (Aufruf einer Unterklasse aus einer Oberklasse könnte eine schlechte Idee sein) würde geschätzt werden. Danke im Voraus.

EDIT: Ich könnte die Variablen in die "Sub" -Klasse übergeben, aber ich brauche sie aktualisiert werden, so würde ich eine Art von Update-Methode benötigen, um sicherzustellen, dass die Variablen in Sub geändert werden, wenn sie in sind Main. Das ist leicht machbar, aber ich frage mich, ob es einen leichteren/besseren Weg gibt.

+1

Was von 'Main' in vererben den Zweck ist gegeben hat? der Name 'Main', es bedeutet, dass es das Hauptprogramm, ein d Es macht keinen Sinn, zwei "Haupt" -Programme zu haben. –

+0

@BryanOakley Es ist nicht zwei Hauptprogramme, in meinem Spiel hatte ich eine Funktion zum Erstellen von Pfaden, jetzt möchte ich x Menge von Pfaden machen, also habe ich eine Pfadklasse gemacht, damit ich x Objekte der Pfadklasse machen kann. Es erfordert Variablen aus der Hauptklasse, um die Berechnungen durchzuführen, deshalb erbt es von main. –

+1

Ihr Beispiel ist schwer zu verstehen, weil keine Klasse tatsächlich etwas tut. Du sagst, du brauchst "sub", aber deine Klasse macht nichts damit. Warum benötigt Ihre Klasse eine Instanz einer eigenen Unterklasse? Wenn jede Instanz von "Main" eine Instanz von "Sub" benötigt und "Sub" eine Instanz von "Main" ist, dann heißt es, jede Instanz von "Sub" benötigt eine Instanz von "Sub", die rekursiv ist nur konzeptionell. Wenn "Sub" "Variablen aus der Hauptklasse benötigt", heißt das nicht, dass Sie "Sub" von "Main" erben müssen; Sie könnten einfach die 'Main'-Instanz selbst an eine' Sub'-Methode übergeben lassen. – BrenBarn

Antwort

2

Sie missverstehen den Zweck der Unterklassen. Die Vererbung dient nicht zum Freigeben von Daten, sondern zum Erstellen von Sonderfällen eines allgemeinen Typs.

Wenn Sub sollte genau wie Main mit ein paar Spezialisierungen dann sollten Sie Vererbung verwenden. Wenn Sie sagen, dass "Sub" eine Unterklasse von "Main" ist, sagen Sie "Sub ist ein Main", nicht "Sub nutzt Main".

Wenn Sub nur Zugriff auf Daten in Main benötigt, verwenden Sie Zusammensetzung . Wenn Sub Bedarf Daten von Main, eine Instanz von Main-Sub passieren, und haben Sub arbeiten auf der Instanz

. zum Beispiel:

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

Danke, das hilft sehr. Ich bin neu in der Objektorientierung, so dass ich das Konzept nicht vollständig verstehe. Ich wusste, dass abgeleitete Methoden und Variablen von der Elternklasse und von meinem begrenzten Wissen, die die beste Art waren, die Variablen an eine andere Klasse weiterzugeben, geerbt wurden. –

+0

Ich habe eine Frage zu dieser Lösung. Wenn sich eine Variable von Main nach der Erstellung eines Sub-Objekts ändert, wird sie in der Sub-Klasse aktualisiert? Wird der aktuelle Status von Main in der Sub-Klasse reflektiert? –

+0

@ TheTesseract'sShadow: Es wird nicht in der Sub-Klasse aktualisiert, da es in der Sub-Klasse nicht existiert. Es existiert in der Main-Klasse und alles, das einen Verweis auf die Main-Klasse hat, hat einen Verweis auf den geänderten Wert. Daher wird die Änderung _visible_ in der Sub-Klasse sein, anstatt _in_ der Sub-Klasse zu sein. –