Seite 1 von 1

Variable einer Methode einer Klasse global verwenbar

Verfasst: Dienstag 1. Oktober 2019, 21:05
von yum
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

Re: Variable einer Methode einer Klasse global verwenbar

Verfasst: Dienstag 1. Oktober 2019, 22:03
von sls
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.

Re: Variable einer Methode einer Klasse global verwenbar

Verfasst: Dienstag 1. Oktober 2019, 23:04
von kbr
@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.

Re: Variable einer Methode einer Klasse global verwenbar

Verfasst: Mittwoch 2. Oktober 2019, 06:39
von yum
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,

Re: Variable einer Methode einer Klasse global verwenbar

Verfasst: Mittwoch 2. Oktober 2019, 06:55
von __deets__
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.

Re: Variable einer Methode einer Klasse global verwenbar

Verfasst: Mittwoch 2. Oktober 2019, 06:56
von yum
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,

Re: Variable einer Methode einer Klasse global verwenbar

Verfasst: Mittwoch 2. Oktober 2019, 07:10
von Sirius3
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()

Re: Variable einer Methode einer Klasse global verwenbar

Verfasst: Mittwoch 2. Oktober 2019, 10:43
von yum
Danke, Sirius3, das hat geholfen!