Seite 1 von 1

AttibuteError: object has no attribute

Verfasst: Freitag 27. November 2020, 10:25
von UweA
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)

Re: AttibuteError: object has no attribute

Verfasst: Freitag 27. November 2020, 10:34
von __blackjack__
@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?

Re: AttibuteError: object has no attribute

Verfasst: Freitag 27. November 2020, 10:42
von __blackjack__
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.

Re: AttibuteError: object has no attribute

Verfasst: Freitag 27. November 2020, 13:40
von UweA
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.

Re: AttibuteError: object has no attribute

Verfasst: Freitag 27. November 2020, 14:24
von Sirius3
@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.

Re: AttibuteError: object has no attribute

Verfasst: Montag 30. November 2020, 08:21
von UweA
@Sirius3: Danke für deine Hinweise!