Hallo,
In einer Methode einer Klasse A muss ich eine Instanz I einer anderen Klasse B erstellen und diese
dann in der gesamten Instanz der Klasse A verwenden können.
Ich kann I aber nicht bereits beim Konstrukt von A erstellen, weil zu diesem Zeitpunkt die Parameter für I
noch nicht bekannt sind.
Wie geht das?
LG,
Reinhard
Variable einer Methode einer Klasse global verwenbar
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
Was hast du denn bisher schon versucht um das zu erreichen? Um was für eine Art von Anwendung handelt es sich?
Das klingt noch etwas ungenau, so ganz grundsätzlich würde ich in A warten, bis alle Parameter für I bereitstehen wenn I für A zwingend erforderlich ist.
Das klingt noch etwas ungenau, so ganz grundsätzlich würde ich in A warten, bis alle Parameter für I bereitstehen wenn I für A zwingend erforderlich ist.
When we say computer, we mean the electronic computer.
@yum: Wenn ich Dich so verstehen darf, dass Du bereits mehrere Instanzen von A erzeugt hast, bevor die Informationen zur Erzeugung einer Instanz I von B zur Verfügung stehen, Du diese später aber auch den bereits erzeugten Instanzen von A verfügbar machen möchtest, dann könnte eine Lösung sein, I nach der Instanziierung zu einem Klassenattribut von A zu machen. Ob das eine wirklich gute Idee ist, lässt sich ohne weitere Informationen jedoch nicht beantworten.
sls hat geschrieben: ↑Dienstag 1. Oktober 2019, 22:03 Was hast du denn bisher schon versucht um das zu erreichen? Um was für eine Art von Anwendung handelt es sich?
Das klingt noch etwas ungenau, so ganz grundsätzlich würde ich in A warten, bis alle Parameter für I bereitstehen wenn I für A zwingend erforderlich ist.
Hallo,
Ist eine wx - Anwendung und warten geht leider nicht.
lg,
Wenn es nicht zur Konstruktion geht, dann machst du es eben später. Im Konstruktor legst du nur einen Namen an dem du None zuweist. Und im Code musst du vor dem Zugriff eben prüfen, ob der Wert das noch ist, bevor du zugreifst.
Hallo kbr,kbr hat geschrieben: ↑Dienstag 1. Oktober 2019, 23:04 @yum: Wenn ich Dich so verstehen darf, dass Du bereits mehrere Instanzen von A erzeugt hast, bevor die Informationen zur Erzeugung einer Instanz I von B zur Verfügung stehen, Du diese später aber auch den bereits erzeugten Instanzen von A verfügbar machen möchtest, dann könnte eine Lösung sein, I nach der Instanziierung zu einem Klassenattribut von A zu machen. Ob das eine wirklich gute Idee ist, lässt sich ohne weitere Informationen jedoch nicht beantworten.
es ist eine wx Anwendung, die über die serielle Schnittstelle eine Maschine steuert. Damit ich eine Instanz der Maschinen-Klasse erzeugen kann, muss ich zuerst einige Parameter wissen,
wie etwa die Einstellungen des seriellen Ports, die Geschwindigkeit, einige Grenzwerte,...
Aufgebaut ist es als model-view-controller und die einzelnen Module reden über pubsub miteinander.
Ja, I nach der Instanzierung zu einem Klassenattribut zu machen, trifft es in Worten ganz gut - wie geht das?
Hier einmal, wie weit ich bin - Code reduziert auf das Problem:
Code: Alles auswählen
class classA(object):
def __init__(self):
pass
def method(self):
print('within: classA.method')
instOfclassB = classB()
class classB(object):
def __init__(self):
pass
def method(self):
print('within classB.method')
def main():
print('within main:')
instOfclassA = classA()
instOfclassA.method()
# so far, so well
# but now I need this working:
print(instOfclassA.instOfclassB)
if __name__ == '__main__':
main()
und natürlich kommt jetzt der Fehler:
AttributeError: 'classA' object has no attribute 'instOfclassB'
Kann ich in classA, zum Beispiel im __init__ eine "dummy" - Instanz von B erzeugen und dann die richtige Instanz (mit den korrekten Einstellungen für die Maschine)
auf die "dummy" - Instanz übertragen?
lg,
Das geht, wie schon geschrieben, indem man in __init__ dem Attribut None zuweißt, was aussagt, hier ist noch keine gültige Instanz erzeugt, das ist Dein "dummy". Und es ist nichts anderes, wie bei allen anderen Attributen auch, die man nachträglich noch ändert.
Und auch bei Beispiel-Dummy-Variablen und -Klassen solltest Du Dich an die Namenskonvention halten, sonst ist der Code noch schwerer zu lesen, weil die Namen ja für sich keinen Sinn ergeben:
Und auch bei Beispiel-Dummy-Variablen und -Klassen solltest Du Dich an die Namenskonvention halten, sonst ist der Code noch schwerer zu lesen, weil die Namen ja für sich keinen Sinn ergeben:
Code: Alles auswählen
class ClassA:
def __init__(self):
self.instance_b = None
def generate_b(self, parameter_a, parameter_b):
print('within: classA.method')
self.instance_b = ClassB(parameter_a, parameter_b)
class ClassB:
def __init__(self, parameter_a, parameter_b):
self.parameter_a = parameter_a
self.parameter_b = parameter_b
def method(self):
print('within classB.method', self.parameter_b)
def main():
print('within main:')
instance_a = ClassA()
instance_a.generate_b(17, 42)
print(instance_a.instance_b.method())
if __name__ == '__main__':
main()