AttibuteError: object has no attribute

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
UweA
User
Beiträge: 9
Registriert: Dienstag 30. Juni 2020, 08:50

Hallo!
Ich habe folgende Klasse definiert:

Code: Alles auswählen

class myCluster:
    """ Class """
    defect: data.DisplayDefects

    def __init__(self, UNKNOWN):
      self.defect["UNKNOWN"]=UNKNOWN
Die Klasse "defect" stammt aus einer anderen Bibliothek:

Code: Alles auswählen

class DisplayDefects(Enum):
    """Possible display defects."""

    UNKNOWN = "UNKNOWN"
    BURN_IN = "BURN_IN"
Wenn ich jetzt ein Objekt anlege:

Code: Alles auswählen

hallo = myCluster(clustered["UNKNOWN"])
Dann wird eine Exception erzeugt:
Exception has occurred: AttributeError
'myCluster' object has no attribute 'defect'

Warum hat myCluser kein 'defect'-Attribut?
Bei der Autovervollständigung bei 'self.' wird mir sofort 'defect' angeboten.(Habe ich dann auch verwendet, d.h. kein Verschreiber möglich)
Benutzeravatar
__blackjack__
User
Beiträge: 14027
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@UweA: Warum sollte `myCluser` so ein Attribut haben? Mit der Typ-Annotation sagst Du nur das welchen Typ es hätte wenn es denn existieren würde, aber es wird ja nirgends angelegt. Und selbst wenn es existieren würde, was denkst Du denn was die Zuweisung über einen Schlüssel an ein `Enum`-Objekt bewirken soll?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
__blackjack__
User
Beiträge: 14027
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dieses `my` sollte aus dem Klassennamen verschwinden. Nicht nur das es in der Schreibweise nicht den Konventionen entspricht, es bietet dem Leser auch keinen Mehrwert solange es nicht auch ein OurCluster, TheirCluster, oder so ähnlich gibt, von dem sich das My abgrenzen würde.

Das Argument UNKNOWN ist ebenfalls falsch geschrieben, denn Argumente sind ja per Definition keine Konstanten. Das macht ja gar keinen Sinn.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
UweA
User
Beiträge: 9
Registriert: Dienstag 30. Juni 2020, 08:50

Danke für deine Hinweise. Ich habe es jetzt hinbekommen, nachdem ich verstanden habe, welche Python-Funktionalitäten ich überhaupt benötige.(Ich komme aus der C-Welt und bin noch bei Python am Anfang...)
Meine Klasse sieht jetzt so aus:

Code: Alles auswählen

@dataclass
class MyCluster:
    """ Class """
    defects: data.DisplayDefects = field(default_factory=dict)

    def add(self, elements:data.DisplayDefects):
      for x in elements:
        self.defects[x]=elements[x]
 
Mein Aufruf ist jetzt so:

Code: Alles auswählen

my_cluster = MyCluster()
my_cluster.add(clustered)
Wie man sieht, brauchte ich ein Dictionary, dass die Schlüssel aus der Enumeration 'DisplayDefects' bezieht.

Ich hätte die Zuweisung, die ich jetzt in der Funktion 'add(...)' mache, gern in der __init__ Funktion eingebaut, bekomme da dann aber den Fehler, dass das Attribut 'defects' nicht existiert. Vermutlich existiert es nur noch nicht, denn in 'add(...)' ist dann ja verfügbar.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@UweA: dataclasses arbeiten anders als normale Klassen: https://docs.python.org/3/library/datac ... processing
Eingerückt wird in Python immer mit 4 Leerzeichen pro Ebene, nicht 2. Das My ist immer noch ein unsinniges Präfix. `x` ist ein schlechter Name für ein Element.
Typannotationen an sich sind oft nur überflüssig, aber wenn sie offensichtlich falsch, dann hat man ein wirkliches Problem: Du behauptest defects wäre vom Typ data.DisplayDefects, ist aber vom Typ dict.
UweA
User
Beiträge: 9
Registriert: Dienstag 30. Juni 2020, 08:50

@Sirius3: Danke für deine Hinweise!
Antworten