dataclass: Attribut soll Instanz einer anderen Klasse sein

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
SinaS
User
Beiträge: 11
Registriert: Freitag 11. März 2022, 14:04

Hallo zusammen,

wahrscheinlich simple Frage: Ich habe zwei Klassen: A und B, beides sind dataclasses.

Im "Konstruktor" der dataclass A möchte ich nun, dass für das Attribut beispiel nur Instanzen der Klasse B eingegeben werden können sind. Ich dachte, das ginge so:

Code: Alles auswählen

class A:
	beispiel:B
Meine IDE zeigt mir dann aber den Fehler "name B " is not defined. Wo sind meine Denkfehler?

Danke!!
VG
SinaS
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich sehe auch keine Definition von B. Also stimmt die Meldung doch.
SinaS
User
Beiträge: 11
Registriert: Freitag 11. März 2022, 14:04

Hallo __deet__,

danke, das war der wichtige Hinweis. Natürlich muss die Definition von B oberhalb des Codes von A erfolgen. In meinem Code war die Definition unterhalb. Da war er, mein Denkfehler.

VG
SinaS
narpfel
User
Beiträge: 688
Registriert: Freitag 20. Oktober 2017, 16:10

Wenn `B` nicht vor `A` definiert werden kann und/oder man zirkuläre Abhängigkeiten hat, gibt es

Code: Alles auswählen

from __future__ import annotations
https://peps.python.org/pep-0563/
Benutzeravatar
__blackjack__
User
Beiträge: 13933
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SinaS: Dein erster Beitrag klingt so als würdest Du glauben man könnte da nur Objekte von Typ `B` zuweisen. Das stimmt aber nicht. Typannotationen haben zur Laufzeit keinerlei Wirkung, man kann da weiterhin Werte von jedem beliebigen Typ zuweisen. Die Annotationen dienen nur der Dokumentation und können von statischen Typprüfungen ausgewertet werden. Letzteres sollte man auch dringend tun, wenn man Typannotationen schreibt, weil es sonst sehr schnell passieren kann, das man fehlerhafte Typannotationen hat, was sehr verwirrend ist. Noch schlimmer als inhaltlich falsche Kommentare oder Dokumentation, weil der Leser bei Typannotationen davon ausgeht, dass die überprüft wurden.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Antworten