Klassen aufruf

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
woehrer
User
Beiträge: 8
Registriert: Montag 1. Februar 2021, 12:14

Hallo zusammen,
Ich habe ein Problem bei einer selber erstellten Klasse.

Code: Alles auswählen

sonden_class.py
class sonden:

    import mysql.connector

    sondenid = ""
    lat = ""
    lon = ""
    hoehe = ""
    server = ""
    vgeschw = ""
    freq = ""
    richtung = ""
    geschw = ""
    mydb = mysql.connector.connect(
        host="localhost",
        user="*************",
        password="***********",
        database="**********",
        )
    mycursor = mydb.cursor()

    def setid(self, id):
        sonden.sondenid = id
        mycursor.execute("SELECT sondenid, lat, lon, hoehe, server, vgeschw, freq, richtung, geschw FROM sonden WHERE sondenid LIKE %s",(sonden.sondenid))
        sonden = mycursor.fetchall()
        sondendaten = sonden[0]
        sonden.sondenid = sondendaten[0]
        sonden.lat = sondendaten[1]
        sonden.lon = sondendaten[2]
        sonden.hoehe = sondendaten[3]
        sonden.server = sondendaten[4]
        sonden.vgeschw = sondendaten[5]
        sonden.freq = sondendaten[6]
        sonden.richtung = sondendaten[7]
        sonden.geschw = sondendaten[8]
        print(sonden)
Wenn ich jetzt diese Klasse im Interpreter aufrufen möchte geb ich ein:
>>>from sonden_class import sonden
>>>sonden.setid("123")

Dann bekomme ich den Fehler:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: setid() missing 1 required positional argument: 'id'


Kann mir jemand sagen wo hier mein Denkfehler ist?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Da läuft einges verquer.

Die Namen von Klassen werden mit großem Anfangsbuchstaben geschrieben, um sie von den Namen von Variablen zu unterscheiden.

Importe gehören nicht in die Klasse sondern an den Anfang der Datei.


Warum ist das eine Klasse? Vielleicht sollte es eine Funktion (ohne Klasse) geben, die die Abfrage für dich macht und einen NamedTuple zurück gibt.

Grundsätzlich solltest du dich noch einmal damit beschäftigen, wie Klassen funktionieren und was sie tun.
Denn du instanzierst nirgends die Klasse sondern arbeitest immer mit Klassenattributen. Genau dafür sind Klassen nicht da, was den Schluss nahe legt, dass du eigentlich auch keine möchtest. Oder das du eine möchtest und nicht verstanden hast, wie man sie verwendet.

Der Name der "setid"-Methode ist irreführend. Da wird keine id gesetzt sondern eine Datenbankabfrage duchtgeführt und die Werte als Klassenattribute (wahrscheinlich unbeabsichtigt falsch) gesetzt.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Eine Klasse gehören auch in der Regel nicht einsam und alleine in ein Modul. Module sind ein Strukturierungsmittel um zusammengehörenden Konstanten, Funktionen, und Klassen in einem Modul-Objekt zu bündeln. Dabei kann es manchmal auch vorkommen das man nur eine Klasse im Modul hat, das ist aber eher die Ausnahme und nicht die Regel.

Eventuell lohnt sich auch ein Blick auf SQLAlchemy.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Klasse zeichnet sich dadurch aus, dass man ein Exemplar der Klasse erzeugen muß, bevor man sie benutzen kann. Du erzeugst aber gar kein Exemplar, sondern nutzt die Klasse nur als globalen Namensraum, was beides falsch ist, sowohl Klasse als Namensraum als auch globale Variablen zu benutzen.
Variablennamen sollte man nicht abkürzen, genausowenig wie Felder in einer Datenbank. vgeschw oder geschw? Was soll das?
Wenn man exakt ein Element erwarten kann, dann ist fetchall die falsche Methode.

Eine Möglichkeit wäre es, wie sparrow schon geschrieben hat, ein Namedtuple zur Datenhaltung zu benutzen:

Code: Alles auswählen

from collections import namedtuple

Sonde = namedtuple("Sonde", "sondenid, lat, lon, hoehe, server, vgeschw, freq, richtung, geschw")

def connect():
    return mysql.connector.connect(
        host="localhost",
        user="*************",
        password="***********",
        database="**********",
    )

def fetch_sonde(connection, sonden_id):
    cursor = connection.cursor()
    try:
        cursor.execute("SELECT sondenid, lat, lon, hoehe, server, vgeschw, freq, richtung, geschw FROM sonden WHERE sondenid LIKE %s", [sonden_id])
        data = cursor.fetchone()
        return Sonde(*data)
    finally:
        cursor.close()
Antworten