OOP Fragen

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.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Sirius3
Jetzt mach mein Beispiel nicht runter :D
ja die "__tostring" funktion wurde später mal in asugelagert in eine "Bibliothek" die
eingebunden wurde. Die index.php is Standard, ich könnte ja noch mein
"WebShop" als Beispiel posten was ebenso in PHP geschrieben wurde. Aber das is bissl
in die Hose gegangen damals. Der Kalender selbst wurde ja mit Hilfe des Lehrers umgesetzt
was halt nach deren Anleitung ging. :P

Denke mal mein Problem liegt einfach darin das ich das Verständnis in Python für OOP nicht ganz habe
und deswegen Probleme habe es umzusetzen. Es gibt halt auch keinen "construtor" und was mich immer
total verwirrt is dieses "self" und mir fehlt das gute alte "$"-Zeichen :D
BlackJack

@Kalli87: Nach welchem Material lernst Du OOP in Python? Was denkst Du was `__init__()` ist? Wie kann Dich `self` verwirren, `this` aber offenbar nicht‽ Und was soll das $ vor Namen bringen? Denn das müsste man in Python tatsächlich vor *jeden* Namen schreiben und wenn man etwas *überall* davor schreiben muss, dann hat das keinen Informationswert und man kann es auch einfach weg lassen.

Ich habe ja so ein bisschen das Gefühl Du hast auch OOP in PHP nicht verstanden und/oder Dich noch überhaupt nicht ernsthaft in Python damit auseinandergesetzt.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

http://www.python-kurs.eu/python3_klassen.php
http://www.tutorialspoint.com/python/py ... bjects.htm

"Einstieg in Python" und "Python 3" als Buch

"__init__()" ist kein wirklicher "constructor" lediglich, wie der name schon sagt, initialisiert es etwas. So hab ichs
bis jetzt gelernt bzw erlesen. In meinem Kopf hängt halt das ganze von PHP noch fest deswegen fällt es mir so
schwer mich der Materie in Python rein zu versetzen.
Das hab ich aber auch schon geschrieben.

Und aus "Einstieg in Python" is halt nur dieses blöde Beispiel mit den Autos drinnen(beschleunigen, bremsen, Farbe, Marke......)
Ich hab mir sogar schon auf YouTube einige Videos dazu angeschaut und trotzdem werd ich nur langsam schlau daraus.
Es braucht halt zeit.......

Mittlerweile wird's ja schon besser mit dem ganzen OOP
BlackJack

@Kalli87: Die Unterschiede zwischen `__init__()` und `__construct()` sind minimal, denn auch in PHP wird da nur das bereits bestehende Objekt initialisiert. Du erzeugst das Objekt dort ja nicht, sondern weist lediglich Attributen einen Wert zu. Der einzige Unterschied ist, dass man die Attribute in PHP deklarieren muss und in `__construct()` nicht initialisieren *muss*. Das sind jetzt aber keine wirklich gravierenden Unterschiede was das Verständnis von OOP angeht.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Kalli87 hat geschrieben:"__init__()" ist kein wirklicher "constructor" lediglich, wie der name schon sagt, initialisiert es etwas.
Was möchtest du von einem "wirklichen" Konstruktor haben, was __init__ nicht kann?

Der eigentliche Konstruktor heißt übrigens __new__ und die meisten Entwickler benötigen ihn quasi überhaupt nicht.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Mädels/Frauen/Jungs/Männer
ich weiß ja nicht was ihr alle seit.

Ich hab es schon begriffen was ihr mir sagen wollt, ich seh manchmal den Wald vor lauter Bäumen nicht
das geb ich zu.
Für mich ist es eher eine Umstellung da es eine für mich neue Sprache ist obwohl
sie doch recht simple manchmal ist aber dann auch wieder nicht und das ganze gepaart mit OOP
is schon anstrengend.

Ich hatte heute alleine 4 Endlosschleifen gehabt die nicht mehr beendet konnte. Der PC
war komplett lahm gelegt und da war nix mit Entwicklungsumgebung schnallt das und beendet es
von alleine wie sonst auch. Gelöst hab ich es dann alleine. Bzw. Schritt für Schritt getestet wo
die Schleife her kommt.

Außerdem bin ich eher froh das es hier im Forum genug Leute gibt die einem helfen, auch wenn
ihre Antworten meist so geil umschrieben sind das man 5 mal drüber nachdenken muss damit
man versteht was sie einem damit sagen wollen.

Erneut bitte ich um Nachsicht über meine Unwissenheit, denn jeder hat mal klein angefangen ;)

Ps.: Ich hab heute noch kein neues Thread erstellt um euch mit Fragen und Problemen zu belästigen :D

PPs.: Seht das bitte als spaß an ;)

PPs.: Außerdem is Freitag.........
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Kalli87 hat geschrieben:Ich hatte heute alleine 4 Endlosschleifen gehabt die nicht mehr beendet konnte. Der PC
war komplett lahm gelegt und da war nix mit Entwicklungsumgebung schnallt das und beendet es
von alleine wie sonst auch.
Ich habe noch auf jedem meiner Rechner auf allen Systemen jede Endlosschleife beenden können (von unechten Dingern wie Fork-Bombs mal abgesehen). Was zur Hölle hast du da veranstaltet? Und warum sollte eine IDE mein Programm abbrechen nur weil sie glaubt, dass möglicherweise eine Endlosschleife vorliegt? Manchmal möchte ich sogar Endlosschleifen haben - auf meinem neuen Rechner werden die ohnehin in der Hälfte der früher benötigten Zeit fertig.
Kalli87 hat geschrieben:PPs.: Seht das bitte als spaß an ;)
Ach so. Ja dann.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

PyCharm merkt halt wenn eine Endlosschleife da is oder irgendwas nicht ganz rund läuft und hält es an.
Ich war gerade dabei das Login weiter zu basteln und konnte mich auch einloggen und eine Fehlermeldung
ausspucken lassen wenn die Daten falsch waren. Nun wollte ich nachm login, wenn es erfolgreich war,
das er mir das eigentliche Hauptprogramm starten soll, natürlich erst mal nur ein neues Fenster anzeigen soll.
Und da saß auch der Fehler sobald ich auf Login geklickt habe ging nix mehr, das einzige was noch ging war die Maus
aber auch nur die Bewegung, kein klicken oder ähnliches, Tastatur war auch tot.

Ps.: Was ich vorhin mit dem Post sagen wollte is, nehmt es auf die leichte Schulter
BlackJack

@/me: Schleifen die nicht nur endlos laufen sondern dabei noch endlos Speicher anfordern bekommt man oft nicht beendet wenn man es nicht rechtzeitig vor dem Swappen merkt. Ob man dann bei jedem Tastendruck fünf Minuten wartet bis das System beim ganzen Swappen darauf reagiert, oder einfach darauf wartet bis der `MemoryError` den Spuk beendet, läuft da zeitlich auf's gleiche hinaus: Ein System das eine ganze Zeit lang nicht mehr benutzbar ist. :-)
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ja sowas passiert mir natürlich gleich 4 mal :D

Ich korrigiere: 5 mal ...... :lol:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zum ersten darf man nichts negatives sagen - also tue ich das hier auch nicht! Das zweite macht alleine beim drüber scrollen schon einen schlechten Eindruck (kein PEP8 bei Methodennamen, ``__del__`` wird "besprochen", usw).

Man kann also durchaus auch andere Tutorials einmal in Betracht ziehen. "Learn python the hard way" wird gerne empfohlen, wobei ich nicht weiß, ob es da einen dezidierten OOP Teil gibt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

/me hat geschrieben:
Kalli87 hat geschrieben:Ich hatte heute alleine 4 Endlosschleifen gehabt die nicht mehr beendet konnte. Der PC
war komplett lahm gelegt und da war nix mit Entwicklungsumgebung schnallt das und beendet es
von alleine wie sonst auch.
Ich habe noch auf jedem meiner Rechner auf allen Systemen jede Endlosschleife beenden können (von unechten Dingern wie Fork-Bombs mal abgesehen). Was zur Hölle hast du da veranstaltet?
Vielleicht hat er versehentlich eine Endlosschleife zum Anhängen von neuen Elementen an eine Liste oder zum Verketten von Strings (``s += irgendwas`` in einer Schleife mit "ungünstiger" Abbruchbedingung) erzeugt. Wenn man das einmal in Schwung bringt, ist es meist schon zu spät, ehe man gemerkt hat, was Sache ist. Da hilft dann oft nur noch ein Reboot des Rechners.

Häufig hilft es, ``for``-Schleifen anstelle von ``while``-Schleifen zu nehmen. Es kommt aber natürlich auf den Anwendungsfall an, ob das Programmieren als ``for``-Schleife sinnvoll ist. Und bekanntlich können auch ``for``-Schleifen manchmal endlos laufen.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Hier mal ein kleiner Auszug aus dem aktuellem Stand der Technik ;)

Code: Alles auswählen

__author__ = 'Kalli87'
from gi.repository import Gtk
from gi.repository import Pango
import tkinter
import tkinter.ttk
import tkinter.messagebox
import psycopg2
from tkinter import *
from tkinter.ttk import *
import os

class Application(Frame):

    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.datenbank()
        self.layout_login()

    def datenbank(self):
        connection = psycopg2.connect("dbname=sqltest")
        self.cursor = connection.cursor()

    def layout_login(self):
        Button(text = "Login", command = self.login).grid(row=5, column=0, sticky=NSEW, pady=4)
        Button(text='Schließen', command = self.master.quit).grid(row=5, column=1, sticky=NSEW, pady=4)

        Label(text="Username", font="Helvetica 13 bold").grid(row=4, column=0, pady=5, padx=5)
        Label(text="Passwort", font="Helvetica 13 bold").grid(row=4, column=1, pady=5, padx=5)

        self.benutzername = Entry(font=10)
        self.benutzername.grid(row=3, column=0, padx=5, pady=5)

        self.passwort = Entry(font=10, show="******")
        self.passwort.grid(row=3, column=1, padx=5, pady=5)


    def login(self):
        root.protocol("WM_DELETE_WINDOW", self.master.quit)
        self.cursor.execute("SELECT * FROM mitarbeiter WHERE loginname = %s AND passwort = %s ", (self.benutzername.get(), self.passwort.get()))
        row = self.cursor.fetchone()
        self.benutzername.delete(0, END)
        self.passwort.delete(0, END)


        if row is not None:
            print("Login erfolgreich!")

            def kunde_neu():

                nb = Notebook(self.master, name='nb', width=800, height=400) # create Notebook in "master"
                nb.grid(row=6, column=2) # fill "master" but pad sides

                tab_kunde_neu = Frame(nb, name='tab-kunde-neu')
                nb.add(tab_kunde_neu, text="Kunde (neu)")

                Label(tab_kunde_neu, text="Titel", font="Helvetica 13 bold").grid(row=1, column=0)
                Label(tab_kunde_neu, text="Name", font="Helvetica 13 bold").grid(row=1, column=2)
                Label(tab_kunde_neu, text="Vorname", font="Helvetica 13 bold").grid(row=1, column=4)
                Label(tab_kunde_neu, text="Anrede", font="Helvetica 13 bold").grid(row=3, column=0)
                Label(tab_kunde_neu, text="Geburtstag", font="Helvetica 13 bold").grid(row=3, column=2)
                Label(tab_kunde_neu, text="Staatsangehörigkeit", font="Helvetica 13 bold").grid(row=3, column=4)
                Label(tab_kunde_neu, text="Steueridentifikationsnummer", font="Helvetica 13 bold").grid(row=5, column=0)
                Label(tab_kunde_neu, text="Finanzamt", font="Helvetica 13 bold").grid(row=5, column=2)
                Label(tab_kunde_neu, text="Strasse", font="Helvetica 13 bold").grid(row=7, column=0)
                Label(tab_kunde_neu, text="Hausnummer", font="Helvetica 13 bold").grid(row=7, column=2)
                Label(tab_kunde_neu, text="Postleitzahl", font="Helvetica 13 bold").grid(row=9, column=0)
                Label(tab_kunde_neu, text="Ort", font="Helvetica 13 bold").grid(row=9, column=2)
                Label(tab_kunde_neu, text="Telefon", font="Helvetica 13 bold").grid(row=11, column=0)
                Label(tab_kunde_neu, text="Telefax", font="Helvetica 13 bold").grid(row=11, column=2)

                titel = Entry(tab_kunde_neu, font=10)
                titel.grid(row=0, column=0)
                name = Entry(tab_kunde_neu, font=10)
                name.grid(row=0, column=2)
                vorname = Entry(tab_kunde_neu, font=10)
                vorname.grid(row=0, column=4)
                anrede = Entry(tab_kunde_neu, font=10)
                anrede.grid(row=2, column=0)
                geburtstag = Entry(tab_kunde_neu, font=10)
                geburtstag.grid(row=2, column=2)

                sql=("SELECT * FROM staatsangehoerigkeit")
                self.cursor.execute(sql)

                staat = StringVar(tab_kunde_neu)
                staat.set("Staatsangehörigkeit")

                laender=[]
                for dsatz in (self.cursor):
                    staatsangehoerigkeit = dsatz[0]
                    laender.append(staatsangehoerigkeit)
                dropdown = OptionMenu(tab_kunde_neu, staat, staat.get(), *laender )
                dropdown.grid(row=2, column=4, sticky=NSEW)

                steuer = Entry(tab_kunde_neu, font=10)
                steuer.grid(row=4, column=0)
                finanzamt = Entry(tab_kunde_neu, font=10)
                finanzamt.grid(row=4, column=2)
                strasse = Entry(tab_kunde_neu, font=10)
                strasse.grid(row=6, column=0)
                hausnr = Entry(tab_kunde_neu, font=10)
                hausnr.grid(row=6, column=2)
                plz = Entry(tab_kunde_neu, font=10)
                plz.grid(row=8, column=0)
                ort = Entry(tab_kunde_neu, font=10)
                ort.grid(row=8, column=2)
                telefon = Entry(tab_kunde_neu, font=10)
                telefon.grid(row=10, column=0)
                telefax = Entry(tab_kunde_neu, font=10)
                telefax.grid(row=10, column=2)

                Button(tab_kunde_neu, text='Schließen', command=self.master.quit).grid(row=5, column=5, sticky=NSEW, pady=4)
                Button(tab_kunde_neu, text='Speichern', ).grid(row=6, column=5, sticky=NSEW, pady=4)
                Button(tab_kunde_neu, text='Abbruch', ).grid(row=7, column=5, sticky=NSEW, pady=4)

            return kunde_neu()
        else:
            print("Fehler!")
            tkinter.messagebox.showwarning('Warnung', 'Passwort oder Username war falsch')

root = Tk()
root.title('WBS')
app = Application(root)
root.mainloop()
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Typisches Beispiel von schnell hingeklatschter GUI-Programmierung: Vielleicht sieht die grafische Oberfläche einigermaßen aus, aber auf die Qualität des Codes wird offenbar kaum Rücksicht genommen. Das wird mit jeder Erweiterung unübersichtlicher und macht dadurch immer weniger Lust, sich mit dem Code zu befassen. Aber muss ja jeder selber wissen...
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

danke snafu für deine Kritik aber es verlangt ja keiner das du dich gerade damit befassen musst.
Ich wollte nur mal meinen aktuellen Stand Posten.

BlackJack, Sirus3 und /me sind bis jetzt die drei gewesen die sehr oft sich zu Wort gemeldet und
geholfen haben. Sie kennen meine Anfangsschwierigkeiten und andere kleinere Dinge wo ich mich
total dumm angestellt habe.

Wenn ich diesen Code und meinen Code den ich vorher fabriziert habe vergleiche kann ich
sagen das es schon sehr viel besser aussieht als vorher.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:Wenn ich diesen Code und meinen Code den ich vorher fabriziert habe vergleiche kann ich
sagen das es schon sehr viel besser aussieht als vorher.
Also ``kunde_neu()`` sieht für mich ziemlich übel aus. Ist das dein Werk oder hat das größtenteils die IDE für dich erledigt?

Und wieso wird ``kunde_neu()`` innerhalb der Methode ``login()`` definiert? Ist dir bewusst, dass das dadurch überhaupt keine Instanzmethode ist?
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Mein Werk, meine Logik, mein Aufbau
Hab es geändert und angepasst
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:Mein Werk, meine Logik, mein Aufbau
Das heißt die ellenlange ``login()``-Methode, die nebenher noch ganz andere Dinge macht als ihr Name vermuten lässt, ist in dieser Form ok für dich?

EDIT: Anscheinend nicht. Inzwischen hast du ja zu deiner Antwort etwas dazueditiert.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Code: Alles auswählen

def login(self):
        root.protocol("WM_DELETE_WINDOW", self.master.quit)
        self.cursor.execute("SELECT * FROM mitarbeiter WHERE loginname = %s AND passwort = %s ", (self.benutzername.get(), self.passwort.get()))
        row = self.cursor.fetchone()
        self.benutzername.delete(0, END)
        self.passwort.delete(0, END)


        if row is not None:
            print("Login erfolgreich!")
            return self.kunde_neu()
        
        else:
            print("Fehler!")
            tkinter.messagebox.showwarning('Warnung', 'Passwort oder Username war falsch')
so besser?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Kalli87 hat geschrieben:so besser?
Auf jeden Fall. Wenn du ein bißchen weiter mit deinen Python-Kenntnissen bist, dann könntest du bei einer fehlgeschlagenen Anmeldung eine Exception werfen. Außerdem ist es nicht so günstig, dass die ``login()``-Methode ihrerseits die Funktionalität zum Erfassen der Kundendaten aufruft. Man könnte - wenn man noch keine Exceptions benutzen möchte - stattdessen die ``login()``-Methode einen Wahrheitswert (also ``True`` oder ``False``) zurückliefern lassen, die anzeigt, ob der Login erfolgreich war. Dann würde der Programmcode, der ``login()`` aufruft, aufgrund dieser Rückgabe entscheiden, was als nächstes geschieht. Verstehst du, was ich meine?
Antworten