2017-10-27 5 views
1

der ‚Staat‘ Muster OOP Verwendung in Python verbleit mich zu diesem Abhängigkeitsproblem:
StateA, StateB und StateC sind drei Staaten die gleiche Methode der Umsetzung event1.
StateB erbt sein Verhalten von StateA.Lösung zyklische Abhängigkeit mit Python Vererbung

Datei a.py:

#from b import StateB 
from c import StateC 

class StateA(object): 
    def event1(self): 
     return StateC() 

print type(StateA().event1()) 

Datei b.py:

import a 
class StateB(a.StateA): 
    def event1(self): 
     return self 

Datei c.py:

class StateC(object): 
    def event1(self): 
     return self 

Solange ich brauche keine StateB in a.py funktioniert das. Aber was, wenn ich den Typ StateB in StateA verwenden möchte?
Importieren StateB (siehe die erste Zeile in kommentierten a.py) führt zu diesen zyklischen Abhängigkeitsfehlern:

ImportError: cannot import name StateB 
+0

Sie können versuchen, eine lokale Import tun (innen einige spezifische Methode) anstatt es am Anfang der Datei zu importieren. –

+0

Was passiert, wenn Sie den globalen Import für Datei b ändern? –

+0

selbe Fehler, wenn ich den globalen Import auf Datei b innerhalb der Methode StateA.event1() verschieben – Francois

Antwort

2

Kreis Abhängigkeiten ein Problem mit dem Code-Design verbunden sind. In der Praxis könnte man das wahrscheinlich nur in schlecht organisiertem Code treffen. Versuchen Sie, Ihren Code umzuformatieren, um dieses Problem zu beheben.

Ein anderer Ansatz (den ich Ihnen nicht vorschlage, nur FYI) ist ein Import außerhalb des Modulebenenimports, aber Sie sollten einen solchen Ansatz vermeiden.

+0

zyklische Abhängigkeit ist oft erforderlich, wenn die "State" -Muster anwenden, weil Schleifen von Übergängen zwischen den Staaten existieren können. – Francois

1

Da Ihre Klassen eng gekoppelt sind, würde ich sie einfach in das gleiche Modul:

Datei my_state.py:

class StateA(object): 
    def event1(self): 
     return StateC() 


class StateB(StateA): 
    def event1(self): 
     return self 


class StateC(object): 
    def event1(self): 
     return self 


print(type(StateA().event1())) 
+0

das würde sicherlich helfen, aber meine tatsächlichen Klassen sind viel größer und ich möchte sie in separaten Dateien wenn möglich zu halten. – Francois

+0

Wenn sie so groß sind, müssen Sie sie wahrscheinlich aufteilen und einige Funktionen/Klassen extrahieren, die dann in separate Module eingefügt werden können. –

Verwandte Themen