Seite 1 von 1

AttributeError: object has no attribute

Verfasst: Dienstag 5. April 2022, 22:03
von gatonero
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()

Re: AttributeError: object has no attribute

Verfasst: Dienstag 5. April 2022, 22:05
von __deets__
Stimmt ja auch. Hat kein write. self.lcd ist das UART-Objekt, das hat ein Write.

Re: AttributeError: object has no attribute

Verfasst: Dienstag 5. April 2022, 22:15
von gatonero
Was muss ich da ändern, damit mein obj etwas rausschreibt?

Re: AttributeError: object has no attribute

Verfasst: Dienstag 5. April 2022, 22:24
von gatonero
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()

Re: AttributeError: object has no attribute

Verfasst: Dienstag 5. April 2022, 22:40
von __blackjack__
@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()

Re: AttributeError: object has no attribute

Verfasst: Dienstag 5. April 2022, 22:53
von gatonero
@__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.