Variable einer Methode einer Klasse global verwenbar

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
yum
User
Beiträge: 4
Registriert: Dienstag 1. Oktober 2019, 20:54

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
Benutzeravatar
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.
When we say computer, we mean the electronic computer.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
yum
User
Beiträge: 4
Registriert: Dienstag 1. Oktober 2019, 20:54

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,
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
yum
User
Beiträge: 4
Registriert: Dienstag 1. Oktober 2019, 20:54

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.
Hallo kbr,

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,
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

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:

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()
yum
User
Beiträge: 4
Registriert: Dienstag 1. Oktober 2019, 20:54

Danke, Sirius3, das hat geholfen!
Antworten