AttributeError: 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
Benutzeravatar
gatonero
User
Beiträge: 21
Registriert: Montag 4. April 2022, 21:12

Ich versuche ein serielles LCD als Klasse zu definieren. Wenn ich versuche das Programm auszuführen erhalte ich die Meldung: AttributeError: 'lcd' object has no attribute 'write'

Was mache ich falsch?

Code: Alles auswählen

# program to illustrate public access modifier in a class
from time import sleep

import machine

class lcd:

    # constructor
    def __init__(self):
        self.lcd = machine.UART(2, baudrate=19200)

    def setup(self):
        self.write('\x16')  # Display Ein
        time.sleep(0.2)
        self.write('\x0C')  # Display löschen, Cursor auf 0, 0
        time.sleep(0.2)
        self.write('\x11')  # Display Hintergrundbeleuchtung Ein
        time.sleep(0.2)

    def message(self):
        self.write('classtest.py')

# creating object of the class
obj = lcd()
obj.setup()
obj.message()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Stimmt ja auch. Hat kein write. self.lcd ist das UART-Objekt, das hat ein Write.
Benutzeravatar
gatonero
User
Beiträge: 21
Registriert: Montag 4. April 2022, 21:12

Was muss ich da ändern, damit mein obj etwas rausschreibt?
Benutzeravatar
gatonero
User
Beiträge: 21
Registriert: Montag 4. April 2022, 21:12

Danke! Die Antwort hat mir weiter geholfen! :-)

Code: Alles auswählen

# program to illustrate public access modifier in a class
from time import sleep

import machine


class lcd:

    # constructor
    def __init__(self):
        self.lcd = machine.UART(2, baudrate=19200)

    def setup(self):
        self.lcd.write('\x16')  # Display Ein
        time.sleep(0.2)
        self.lcd.write('\x0C')  # Display löschen, Cursor auf 0, 0
        time.sleep(0.2)
        self.lcd.write('\x11')  # Display Hintergrundbeleuchtung Ein
        time.sleep(0.2)

    def message(self):
        self.lcd.write('classtest.py')


# creating object of the class
obj = lcd()
obj.setup()
obj.message()
Benutzeravatar
__blackjack__
User
Beiträge: 13985
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gatonero: Der Code wird so nicht laufen weil der Name `time` nicht bekannt ist. Entwder importierst Du `time` und greifst darüber auf die `sleep()`-Funktion zu, oder Du importierst `sleep()` und benutzt das direkt.

Der Name `lcd` ist ungünstig. Falls Du Dich jetzt fragst *welcher* von beiden: Genau deshalb. Eine Klasse modelliert ein ”Ding”. Und die Attribute beschreiben woraus das ”Ding” besteht, beziehungsweise dessen Zustand. Da steht also das ein LCD aus einem LCD besteht. Was komisch klingt. Das LCD-Objekt besteht aus einer seriellen Verbindung zu einem physischen LCD.

Klassennamen werden in Python per Konvention in PascalCase geschrieben, damit man Klassen besser von Exemplaren unterscheiden kann. Dann brauchst Du das Exemplar auch nicht `obj` zu nennen, was ja extrem nichtssagend ist, sondern das heisst dann `lcd`.

`__init__()` ist kein Konstruktor. Das wäre `__new__()`. In beiden Fällen braucht es keinen Kommentar.

Der allererste Kommentar ist komisch, denn so etwas wie einen „public access modifier“ gibt es in Python nicht.

Code: Alles auswählen

from time import sleep

import machine


class LCD:
    def __init__(self):
        self.connection = machine.UART(2, baudrate=19_200)

    def setup(self):
        self.connection.write('\x16')  # Display Ein.
        sleep(0.2)
        self.connection.write('\x0C')  # Display löschen, Cursor auf 0, 0.
        sleep(0.2)
        self.connection.write('\x11')  # Display Hintergrundbeleuchtung Ein.
        sleep(0.2)

    def message(self):
        self.connection.write("classtest.py")


lcd = LCD()
lcd.setup()
lcd.message()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
gatonero
User
Beiträge: 21
Registriert: Montag 4. April 2022, 21:12

@__blackjack__: Vielen Dank! :-)

Ich habe bisher erst sehr wenig Python-Erfahrung. Deshalb habe ich Beispiele von einem "Guru" adaptiert. Solche Hinweise wie von Dir verhindern, dass sich Fehler einschleichen.
Antworten