OOP - erste 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.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Was bezeichnet ihr als Basics?

Was ich bisher beherrsche:

-Kontrollstrukturen
-Basisdatentypen
-Dateien
-Funktionen
-Modularisierung
-Schnittstelle zum Betriebssystem

Ich möchte gerne ein etwas größeres Projekt starten. Wüsste nur nicht was. :K
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Tja, was ist ein größeres Projekt? Vielleicht die visuelle Darstellung von irgendwelchen Daten. Also Datei mit Daten einlesen, Achsen zeichnen, beschriften, Daten plotten.
Oder ein Labyrinth anlegen und versuchen einen Weg hindurch zu finden - und zwar möglichst schnell.
Oder ein Textadventure.
Oder wenn Du an Logfiles kommst, analysiere diese (wie viel Traffic, wie viele Errors, etc.).

Da lässt sich beim üben schon einiges lernen. Wähle ein Thema, das Du gerne umsetzen möchtest und für Deine Kenntnisse nicht zu schwer ist. Du sollst ja Spaß daran haben. Aber solange Du nicht irgendeinen Kurs abarbeiten möchtest, brauchst Du die Idee schon selbst.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich interessiere mich sehr für Netzwerkprogrammierung. Vielleicht könnte ich einen kleinen Trojaner bauen, der bestimmte Sachen abfängt un an bestimmte Server schickt.

Oder ein Programm, dass Inhalte bestimmter Dateien auflistet. Registryinhalte (sprich Schlüssel) auflistet usw.

Textadventure wäre auch sehr spannend.
as Du gerne umsetzen möchtest und für Deine Kenntnisse nicht zu schwer ist
Das ist das Problem. Ich kann meine Kenntnisse nicht einschätzen. Denke aber schon, dass ich weitgehenst alles verstanen habe.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Nun, dann beginne doch damit. einen einfachen Echo-Server mit passendem Client zu entwickeln. Zunächst reicht es, genau eine Verbindung zu aktzeptieren. Im weitern Verlauf entwickelst du den Server derart weiter, dass er mehrere Verbindungen (gleichzeitig) verarbeiten kann (Variante A: Mit Threads, Variante B: Non-Blocking IO).

Damit wärst Du bereits einige Abende beschäftigt und neue Erkenntnisse sind gewiss (erforderlich).

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

OK werde mir die Sache annehmen. Vielen,vielen,vielen Dank! Kriegste ein virtuelles Bier geschenkt.

Wird also so eine Art ChatProgramm zum Schluss. Erst mal eine Verbindung, dann mit Threads arbeiten und dann umwandeln in ein Chatprogramm. :)
BlackJack

In der Python-Dokumentation gibt es das Socket Programming HOWTO. Ansonsten ist auch Literatur zu Socket-Programmierung in C nützlich, denn das `socket`-Modul in Python ist nur eine recht dünne Schicht über der BSD-Socket API die man üblicherweise von C aus verwendet.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ui weißt Du ob das Galileo Computing Buch darüber ordentliche Infos liefert. Besprochen werden die Module: socket, ftplib,imaplib

Habe grad einen anderen Thread eröffnet, indem es um Kleinigkeiten geht, aber Kleinigkeiten sind Dinge, die mal zum späteren Zeitpunkt wichtig werden können.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Gary123456 hat geschrieben:Ui weißt Du ob das Galileo Computing Buch darüber ordentliche Infos liefert. Besprochen werden die Module: socket, ftplib,imaplib
Habe gerade das Kapitel zu sockets überflogen, aber wenn du einen Chat-Server machen willst, nutz doch das asynchat-Modul aus der Stdlib, das ist ziemlich brauchbar dafür.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Da gibt es ja an die 70 Seiten rein über Netzwerkprogrammierung. Ich interessiere mich sehr für Netzwerke und werde mir alles durchlesen. Sprich auch alle Module ansehen. Ich denke aber, dass das jetzt abseits des eigentlichen Themas ist. Aber was solls. Es gibt aber sicher mehr Module üfr Netzwerke, als die, die im Buch beschrieben worden sind. Werde mir dazu alles ansehen. Auch das Themengebiet Threads werde ich mir genüsslich vor die Nase reiben. Hehe freu mich schon drauf.
barrio
User
Beiträge: 30
Registriert: Dienstag 26. Februar 2013, 13:15

Der Beitrag entwickelt sich zwar grad mehr in Richtung Netzwerke, ich hätte allerdings auch noch mal ein paar grundsätzliche Fragen zu OOP in Python. Ich konnte mit etwas Glück auch ohne Bon das "unfassbare Handbuch" zurückgeben und mach nun mit "OOP mit Python" von Weigend (ausgeliehen) weiter :) . Da ich OOP nur in Grundzügen von C her kenne verwunderte mich erstmal, dass Attribute public per default sind und sogar dynamisch erzeugt werden können. Der Autor schrieb das "Restriktionen in der Pythoncommunity generell verpönt" seien, aber andererseits Attribute wenn möglich immer private sein sollten? #
TNX
> (...(lambda...(it-schemes-i-must-be-jailed-in-braces? code)...))))))))))))))))))))))))))
#t
BlackJack

@barrio: Du kennst OOP in Grundzügen von *C*? :shock: Nicht das mit C nicht auch OOP möglich ist, aber die Sprache selbst bietet dafür ja keine Unterstützung.

Attribute sollen nicht privat sein, sondern der Zustand eines Objekts sollte angemessen gekapselt sein. Kapselung ist nicht gleichzusetzen mit erzwungenem Zugriffsschutz. Es können auch Namenskonvention, Dokumentation, oder gesunder Menschenverstand verwendet werden.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@barrio: Python ist offen, d.h. es sind stets alle Attribute zugänglich. Privat bedeutet in dieser Hinsicht, dass man sorgsam ist und in anderen Namensräumen nicht rumfummelt. Lesen ist kein Problem, aber beim setzen von Werten sollte man schon genau wissen was man tut. Gehe also nicht an fremde Attribute, es sei denn, diese sind explizit dafür vorgesehen.
Eine Warnung ist in dieser Hinsicht ein führender Unterstrich, quasi private per Konvention. Zwei führende Unterstriche werden zur Vermeidung von Namenskollisionen bei Vererbungshierarchien eingesetzt. Das brauchst Du nur selten und alle anderen Erklärungen sind falsch, egal in welchen Büchern sie auch stehen mögen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nehmen wir mal an du meintest C++ statt C, dann ist es auch dort moeglich Zugriffsbeschraenkungen zu umgehen - sei es durch Pointer oder `#define private public`. Wenn man einmal anerkannt hat, dass es sinnvolle Gruende gibt Zugriffsschutz zu umgehen, stellt sich nur noch die Frage wie schwer man das machen will. Im Fall von Python ist die Grundeinstellung, dass man Entwicklern vertrauen kann, statt der Zwangsjackeneinstellung von C++ (oder Java). "we are all consenting adults here" faellt an der Stelle haeufiger.
lunar

@cofi Deine Behauptung, man könne die Zugriffsbeschränkungen umgehen, nicht zu halten, insbesondere nicht mit der von Dir wohl beabsichtigten Implikation, es wäre so einfach wie in Python oder Java, allgemein in dynamischen Sprachen.

Innerhalb des Standards lassen sich die Beschränkungen nicht mit Erfolgsgarantie umgehen. "#define private public" ist illegal, da der Standard nicht gestattet, Schlüsselwörter als Präprozessor-Makros zu definieren. Moderne Compiler geben beim Versuch mindestens eine Warnung aus. Man müsste auch sämtliche Klassen neu kompilieren, die von einer derartigen Definition betroffen sind, da sicher kein Compiler Binärkompatibilität zwischen privaten und öffentlichen Feldern garantiert.

Gleiches gilt für sämtliche Tricks mit Zeigern, die allesamt entweder undefiniertes Verhalten implizieren, oder sich auf das Binärlayout spezifischer Compiler verlassen.

Ich würde die Zugriffsbeschränkungen in C++ auch nicht unter dem Aspekt der Objektorientierung betrachten. Man kann darin viel besser Optionen zur Kontrolle der Binärschnittstelle einer Klasse sehen, und als solche sind diese Optionen in C++ auch ziemlich wichtig, da das binäre Layout von Objekten in C++ eine bedeutende Rolle spielt.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Frage ist immer noch diesselbe:

Habe mir jetzt paar Seiten durchgelesen, nur verstehe ich nicht was Namensräume + Gültigkeitsbereiche genau sind. Das ist etwas kompliziert erklärt, finde ich. Wäre um eine simple Erklärung sehr dankbar!
":roll: Uuups entschuldige. Hier der Link: http://tutorial.pocoo.org/ Ich kann mir einfach nicht genau vorstellen, was ich unter diesen Begriffen verstehen soll. Ich habe diese 2 Seiten mind 5 mal durchgelesen und ich verstehe teilweise nur Bahnhof."
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ein Gültigkeitsbereich gibt an, in welchem Bereich welche Variablen (bzw. Daten im Allgemeinen) verfügbar sind. Im Prinzip erzeugst du mit jeder Funktion einen Gültigkeitsbereich:

Code: Alles auswählen

def func():
    spam = 42

ham = 23
"spam" existiert hier num im Gültigkeitsbereich von "func", aber nicht im globalen Gültigkeitsbereich. Du kannst also nur von innerhalb der Funktion auf "spam" zugreifen. "ham" hingegen liegt im globalen Gültigkeitsraum und ist auch aus "func" (welches ebenefalls im globalen Raum liegt) erreichbar. Bei Python (und bei vielen anderen Sprachen auch), kannst du Gültigkeitsbereiche in einander verschachteln und aus dem inneren Bereich auf den äußeren zugreifen.

Namensräume sind im Prinzip sehr ähnlich zu Gültigkeitsbereichen: mit Namensräumen kannst du eine Hierachie von Namen aufbauen, auf die du dann (auch von außen) zugreifen kannst. In Python kannst du Namensräume mit Modulen und Klassen aufsannen:

Code: Alles auswählen

class Spam(object):
    def ham(self, ...):
        ....
"Spam" ist nun ein Namensraum, in dem sich der Name "ham" befindet. Von außen kannst du nun darauf mittels "Spam.ham" zugreifen. Das ganze kannst du natürlich beliebig verschachteln:

Code: Alles auswählen

class Spam(object):
    class Ham(object):
        class Eggs(object):
            def foo(self, ...):
                ...
Damit hast du dann die Namensräume "Spam", "Ham" und "Eggs", welche alle ineinander verschachtelt sind.

Das ist natürlich alles nur sehr grob und oberflächlich beschrieben, für den Anfang sollte das aber reichen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Gary123456 hat geschrieben:Frage ist immer noch diesselbe: ":roll: Uuups entschuldige. Hier der Link: http://tutorial.pocoo.org/ Ich kann mir einfach nicht genau vorstellen, was ich unter diesen Begriffen verstehen soll. Ich habe diese 2 Seiten mind 5 mal durchgelesen und ich verstehe teilweise nur Bahnhof."
In der Frage fehlt immernoch _was genau_ du nicht verstehst. EyDus Schrottflintenansatz mag helfen oder nicht, ist aber in jedem Fall fuer den Ersteller zeitaufwendig fuer dich aber nicht unbedingt zielfuehrend.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Na, wenn die mal nicht nach hinten los geht...

@Gary: Ich werde das Gefühl nicht los, dass Du zuviel auf einmal willst. Als Tipp - geh es langsamer an, such Dir kleine Problemstellungen und Spielideen, die Du umsetzen möchtest. Dabei wirst Du Fehler machen, aus denen Du lernen kannst und Dir die Welt des Programmierens Schritt für Schritt erschliesst. Den ganzen paradigmatischen Überbau von Anfang an erfassen zu wollen, ist doch öde, da Du den Sinn dahinter höchstens vermuten kannst. Über den spielerischen Zugang macht die Sache Spaß, über den Nürnberger Trichter ohne gewisse Vorkenntnisse - nunja...
So hab ich lange Zeit glücklich ohne jedwede Kenntnis von OOP in Turbo Pascal vor mich hin programmiert (bis hin zu einem kleinen GUI-Toolkit), dann kam Delphi mit Object Pascal und ich dachte - pff, was soll das, diese Objektdinger mit Prozeduren dran brauche ich nicht. Es hat noch eine ganze Weile gedauert, bis ich erkannte, dass ich mit records und units was Vergleichbares gemacht hatte und dass es eigentlich toll ist, wenn einem die Sprache dabei entgegen kommt (Der darauffolgende Switch zu C war dann eher traumatisch für mich ;) )
Das soll kein Plädoyer dafür sein, dass Du die Entwicklung der Programmiersprachen nachvollziehen musst, um die Konzepte dahinter zu verstehen. Mir gehts eher darum - lerne laufen, entdecke den Spass am Laufen - dann wird Fahrradfahren sehr viel leichter.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Naja, ich hatte schon etwas davor geproggt. Auch etwas größere Tools. Da mir diese Sprache zu "langweilig" wurde, bin ich nach Python umgestiegen. Durch "EyDu" habe ich das jetzt alles verstanden und bin richtig froh darüber.

Zu einer ganz anderen Sache:
Ich habe mir vorgenommen ein größeres Chatprogramm zu schreiben mit richtiger GUI. Nun weiß ich, dass das nicht in paar Wochen geht sondern habe mir ca. an die 9Monate vorgenommen. Dazu habe ich einen Partner gefunden, der mit mir diese Sache proggt. Klingen diese 9 Monate realistisch für Threads, Netzwerkprogrammierung, OOP und TKINTER? Oder ist das viel zu wenig? Innerhalb dieser 9 Monate will ich mit ihm rein planen und die Sache richtig angehen. Ich denke Planung ist das A und O für ein solch großes Projekt.

Wäre um Antwort sehr dankbar! :D
BlackJack

@Gary123456: Das lässt sich schwer als Aussenstehender einschätzen. Es kommt ja darauf an wie schnell Du die Sachen lernst. Und auch auf Deinen Kollegen — lernt der gleich schnell, oder schneller und kann Dir was erklären, oder langsamer und hält damit auf…
Antworten