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
Anigrim
User
Beiträge: 4
Registriert: Freitag 22. November 2013, 16:43

Servus,

bin noch ziemlich bei den Anfängen von Python und schreib mir nen Ampelmanager und hab nun folgendes Problem:

Ich erzeuge 1 Ampel und schalte diese-> keine Probleme. Ich erzeuge 2 Ampeln und schalte diese-> Beim Schaltvorgang gibt er mir den Fehler "object has no attribute" raus

Code: Alles auswählen

   ampelmanager = AmpelManager()
            ampelmanager.ampel11 = ampelNS11
- Ich habe eine Klasse erzeugt und dann innerhalb einer Methode, "ampelNS11" erzeugt, welche sofort Werte zugewiesen bekommt(rot,gruen....)
- danach wird dies vom ampelmanager übernommen und zum schaltvorgang geschickt
->

Code: Alles auswählen

    def schalteAmpeln(self):
        global xk
# S1
        if xk == 1 or xk == 2 or xk == 3 or xk == 4 or xk == 5 or xk == 6: # 1....6 sind erzeugte Kreuzungen
            self.ampel11.schalten()
- Hier wird dann die Ampel von zb "Rot" auf "Rot-Gelb" umgeschaltet, jedoch funktioniert das nur mit einer erzeugten Ampel. Sobald ich eine zweite(ampelmanager.ampel21 = ampelNS211) erzeuge gibt mir das Programm einen Fehler aus, aber nicht wie gedacht beim Schaltvorgang der zweiten Ampel, sondern beim Schaltvorgang der ersten Ampel...( object has no attribute 'ampel11')

Ich seh momentan nicht wo der Fehler liegt, warum wird der Vorgang beim Schalten von nur einer Ampel ausgeführt, aber beim Schalten der zweiten Ampel nicht?.... (Für das Schalten der zweiten Ampel hab ich wieder einen Schaltvorgang, ist also unabhängig vom Schaltvorgang S1.


Hoffe das ist genug Code damit man es verstehen/nachvollziehen kann.

Hat jemand ne Idee?

Gruß
Dominik
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Zeig mal bitte den kompletten Traceback. Kann es einfach sein, dass du zwar das Ganze nach dem Erstellen des Objekts geändert hast, du self.ampel11 in der schaltenAmpeln Funktion immer noch verwendest? Außerdem entsprich diese Zuweisung "ampelmanager.ampel11 = ampelNS11" nicht dem Prinzip der objektorientieren Programmierung.

Kleine Anmerkung: Wenn du mehrere Ampeln hast, fang bitte nicht an diese durch zu nummerieren, dazu gibt es Listen oder Dictionaries. So kommt es schnell zu solchen Fehlern.

Zeile 4 kann man viel eleganter Ausdrücken:

Code: Alles auswählen

if xk in (1,2,3,4,5,6):
Generell sollte man global auch nicht verwenden. Bei einer einfachen Ampelschalten sollte man das auch ohne hinbekommen. :)

Grüße,
anogayales
Anigrim
User
Beiträge: 4
Registriert: Freitag 22. November 2013, 16:43

.... Ich wollt hier posten wie ichs genauer gemacht habe, da ist mir der Fehler aufgefallen...
(habe den ampelmanager öfter erzeugt, wodurch er natürlich nach dem Schalten der ersten Kreuzung wieder resettet wurd und ampel11 nichtmehr vorhanden war)

Also das mim global weiß ich, aber für mich war es das einfachste und schnellste, hab mehrere Methoden wo das verwendet wird und da war das dann okay^^

Danke für die Tipps, an dein Codebeispiel hab ich leider garnicht gedacht. Hatte mich mit der erstbesten Lösung zufrieden gegeben =D.
Schneiden in der Schule leider nur die Themen kurz an, bzw ham vieles noch nicht, z.B. hab ich noch nicht mit Listen oder Dictionaries gearbeitet, werds mir aber nun mal anschauen.


Bei soviel Text hat man schon ne "Sichtblockade", dabei trenne ich alles extra durch "#-----" ab und schreib mir Hinweise aber da hat es nichts geholfen^^.
War dann wohl doch leicht unnötig das hier rein zuschreibn, aber ich hab schon ne Zeit lang versucht das zu lösen ohne es zu sehen.

Gruß
Dominik
BlackJack

@Anigrim: Ich kann mir nicht vorstellen das ihr Klassen schreibt ohne Listen und Wörterbücher vorher durchgenommen zu haben.

``global`` ist *nicht* okay. Das wird es auch nicht dadurch das man es in mehreren *Methoden* verwendet. Das hat in Funktionen schon nichts zu suchen, aber in Methoden wirklich überhaupt nichts, denn Klassen und Methoden sind normalerweise der Weg wenn man in einer Funktion nicht ohne auskommt es loszuwerden. Wenn Du also ``global`` in Methoden verwendest, dann machst Du etwas ganz grundlegend falsch.
Anigrim
User
Beiträge: 4
Registriert: Freitag 22. November 2013, 16:43

Okay, das war mir noch nicht ganz klar, werd ich dran arbeitn müssen dass ichs weg bekomm

Also mit Listen oder Dictionaries ham wir echt noch nicht gearbeitet, aber ich glaub das kommt in der nächstn zeit. Ham sowas bisher noch nicht gebraucht. Ich brauchs auch nur weil ich nen programm für mich schreibe.

Gruß
Anigrim
BlackJack

@Anigrim: Das kann nicht sein. Es gibt kein nicht-triviales Programm was die Grunddatentypen von Python nicht braucht. Insbesondere kann es nicht sein das man sich schon mit Klassen beschäftigt, wenn man die Grundlagen noch gar nicht kann.
Anigrim
User
Beiträge: 4
Registriert: Freitag 22. November 2013, 16:43

wie gesagt, bin bei den Anfängen von Python und somit ist meine Programmierweise noch nicht ausgereift. Listen /dictionaries haben wir definitiv noch nicht behandelt.

naja ist ja auch egal ob du das glaubst oder nicht, thema ist ja abgeschlossen kannst also schhließen.

gruß
anigrim
Antworten