Attribut Error: Objekt has not attribute - dies obwohl Code schon gelaufen

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
michpro
User
Beiträge: 19
Registriert: Samstag 27. Dezember 2014, 21:30

Hallo Forum,

stehe gerade etwas auf dem Schlauch und benötige Eure Hilfe. Habe in meinem Programm eine Klasse welche ich zweimal aufrufe. In meinem __main__ habe ich eine TRY - Anweisung welche im 10 Sekunden Takt der Klasse diverse Variablen übergibt und dann die dortige Funktion "LuefterSteuern()" aufruft. Im Shell sehe ich daß dies 3 Mal richtig funktioniert. Im vierten Aufruf bekomme ich im Traceback die Info dass ich ein Attribut nicht habe.

hier der Auszug aus dem Shell / Traceback. Ich habe zur besseren Übersicht nach jedem Durchlauf eine Leerzeile eingefügt:

10-000802f8f890: 24.75 °C
10-000802f8e0ef: 24.38 °C
24.75 / 28.0 / 2.0
ich bin im ELIF Zweig
24.375 / 28.0 / 2.0
ich bin im ELIF Zweig
LuefterWR1_EIN: 0 / LuefterWR2_EIN: 0

10-000802f8f890: 29.00 °C
10-000802f8e0ef: 24.31 °C
29.0 / 28.0 / 2.0
ich bin im IF Zweig
24.312 / 28.0 / 2.0
ich bin im ELIF Zweig
LuefterWR1_EIN: 1 / LuefterWR2_EIN: 0

10-000802f8f890: 30.25 °C
10-000802f8e0ef: 24.31 °C
30.25 / 28.0 / 2.0
ich bin im IF Zweig
24.312 / 28.0 / 2.0
ich bin im ELIF Zweig
LuefterWR1_EIN: 1 / LuefterWR2_EIN: 0

10-000802f8f890: 28.75 °C
10-000802f8e0ef: 24.31 °C
28.75 / 28.0 / 2.0
Traceback (most recent call last):
File "/ablage/nfs/pi/WrKuehl.py", line 217, in <module>
LuefterWR1_EIN = LuefterWR1.LuefterSteuern()
File "/ablage/nfs/pi/WrKuehl.py", line 90, in LuefterSteuern
return self.LuefterEin
AttributeError: 'Luefter' object has no attribute 'LuefterEin'



hier der etsprechende Code... Achtung Line 90 stimmt nicht.

Code: Alles auswählen

#Klasse Luefter anlegen
class Luefter(object):
    def __init__(self, isttemp, solltemp, hysterese):
        self.fIsttemp = isttemp
        self.fSolltemp = solltemp
        self.fHysterese = hysterese


    def LuefterSteuern(self):
        print(str(self.fIsttemp) + " / " + str(self.fSolltemp) + " / " + str(self.fHysterese))

        #Berechnung Schalttemperaturen
        self.fTempLuefterEIN = (self.fSolltemp + (self.fHysterese/2))
        self.fTempLuefterAUS = (self.fSolltemp - (self.fHysterese/2))

        #Vergleich Isttemperatur - Schalttemperaturen
        if self.fIsttemp >= self.fTempLuefterEIN:
            print("ich bin im IF Zweig")
            self.LuefterEin = 1
        elif self.fIsttemp <= self.fTempLuefterAUS:
            print("ich bin im ELIF Zweig")
            self.LuefterEin = 0

        #Rükgabe Lüfter EIN/AUS
        return self.LuefterEin
...
...
...
if __name__ == "__main__":
    #Klasse config Objekt INI-File zuweisen
    config = Config(INI_FILE)

    #GPIO Zuweisung: Pin 11 --> GPIO17 / Pin 12 --> GPIO18
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(11, GPIO.OUT)
    GPIO.setup(12, GPIO.OUT)

    #Verzeichnisstruktur prüfen
    CheckAblage()

    #Werte aus INI-File ermitteln
    fSolltemp = float(config.read_value_ini_file(INI_ITEM_SOLLTEMP))
    fHysterese = float(config.read_value_ini_file(INI_ITEM_HYSTERESE))
    iAktuallisierung = int(config.read_value_ini_file(INI_ITEM_AKTUALLISIERUNG))

    #zyklische Ablaufsteuerung
    PrgEnde = PrgEndeUhrzeit()
    while PrgEnde == 0:
        try:

            fIsttempWR1, fIsttempWR2 = TempRead()

            LuefterWR1 = Luefter(fIsttempWR1, fSolltemp, fHysterese)
            LuefterWR2 = Luefter(fIsttempWR2, fSolltemp, fHysterese)

            LuefterWR1_EIN = LuefterWR1.LuefterSteuern()
            LuefterWR2_EIN = LuefterWR2.LuefterSteuern()

            print("LuefterWR1_EIN: " + str(LuefterWR1_EIN) + " / LuefterWR2_EIN: " + str(LuefterWR2_EIN))
            RelaisLuefter1(LuefterWR1_EIN)
            RelaisLuefter2(LuefterWR2_EIN)

            time.sleep(iAktuallisierung)
            PrgEnde = PrgEndeUhrzeit()

        except KeyboardInterrupt:
            GPIO.cleanup()
            sys.exit(0)

    #ENDE
    GPIO.cleanup()
    sys.exit(0)

Ich hoffe ich habe das verständlich rübergebracht.
BlackJack

@michpro: Offensichtlich sind die Bedingungen so das weder der ``if`` noch der ``elif``-Zweig betreten werden und es damit das Attribut nicht gibt weil es nie gesetzt wurde.

Nebenbei ist die Klasse unsinnig weil die nur aus der `__init__()` und einer weiteren Methode besteht und jedes mal ein neues Exemplar erstellt wird auf dem dann genau diese eine Methode aufgerufen wird. Das hätte man auch mit einer einfachen Funktion erledigen können.

Wenn man Wahrheitswerte meint, sollte man `True` und `False` statt 1 und 0 schreiben. Das ist verständlicher weil dann gleich beim lesen der Wertebereich klar ist.

Die ”Typpräfixe” bei den Namen sind gruselig und die Schreibweise hält sich nicht an den Style Guide for Python Code.
michpro
User
Beiträge: 19
Registriert: Samstag 27. Dezember 2014, 21:30

ah...na klar, das wird es sein. Es steht ja auch im Traceback mein aktueller Wert ist nicht grösser oder kleiner, sondern genau dazwischen.

Ich danke dir.

An meinem Style werde ich dann noch arbeiten.

Gruß michpro
Antworten