Forum: PC-Programmierung Einstieg in Python


von Häuptling Rauchender Kopf (Gast)


Lesenswert?

Moin zusammen,

ich habe zurzeit ein Problem, das ich recht gut in Programmierschritte 
zerteilen kann und von dem ich auch eine ungefähre Vorstellung habe, wie 
es in Code zu gießen wäre.
In Bascom könnte ich das selbständig umsetzen.

Nun möchte ich aber dieses Problem nicht mit einem Mikrocontroller und 
einem LCD, sondern als richtiges Programm lösen. Da fängt mein Problem 
an.

Konkret geht es um die Entwicklung eines kleinen Programms für die 
technische Redaktion (vorerst nur für mich selbst gedacht), das aus 
verschiedenen Eingabeparametern die Mindestanforderungen an die 
Dokumentation für Elektronikprodukte ausgibt (was muss formal vorhanden 
sein, Inhalt ist eine andere Baustelle).
Parameter können sein
a) anzuwendende Richtlinien
(sind bekannt, Mehrfachauswahl)
b) Produktgruppe
(sind bekannt, genau eine Auswahl aus vorgegebenen Möglichkeiten)
c) Platzierung des CE-Zeichens
(falls mindestens eine Richtlinie anzuwenden ist, Mehrfachauswahl - 
mindestens jedoch eine)
d) Platzierung des WEEE-Zeichens
(falls die WEEE-Richtlinie anzuwenden ist, Mehrfachauswahl - mindestens 
jedoch eine)

Aus diesen vier Parametern ergeben sich die Anforderungen. Ich würde mir 
gern eine kleine GUI basteln, die "nichts weiter" machen soll als die 
Ergebnisse der Auswahl in Variablen einzutragen. Diese Variablen sollen 
danach mit ifs verwurstet werden und ein Ergebnis in eine Textbox o.ä. 
ausgeben.

Eine kurze Recherche ergab, dass Python einfach zu erlernen wäre und 
recht bekannt ist. Python kann offenbar objektorientiert oder auch nicht 
objektorientiert eingesetzt werden. Da ich OOP nicht leiden kann (bisher 
nur auf die Schnauze geflogen damit), würde ich gerne weiterhin ohne 
auskommen.

Welche Werkzeuge benötige ich, womit muss ich anfangen?
- GUI
- Variablen händeln (evtl. Array, geht aber auch mit Variablen)
- Bedingungen (if, Schleife etc.)

Ist ActivePython mit Eclipse geeignet oder doch was anderes? Kann jemand 
ein Tutorial empfehlen?

Vielen Dank!

von Dr. Sommer (Gast)


Lesenswert?

Häuptling Rauchender Kopf schrieb:
> Python kann offenbar objektorientiert oder auch nicht
> objektorientiert eingesetzt werden.

Python verwendet wie die meisten anderen Sprachen auch OOP. Wirklich 
ganz ohne OOP zu programmieren ist bei den verbreiteten Sprachen gar 
nicht so einfach, außer bei C. Ist es wirklich so schlimm
1
file.write(...)
statt
1
write(file, ...)
zu schreiben? Ich würde diese Einschränkung noch einmal überdenken und 
vielleicht überlegen, warum du mit OOP "auf die Schnauze" geflogen bist 
und ob du es vielleicht einfach nur nicht richtig verstanden hast.

von peg (Gast)


Lesenswert?

Ich habe früher jahrelang in Fortran (nicht am PC), Microsoft-Basic und 
Assembler programmiert, bis ich vor ca 10 Jahren auf Linux umgestiegen 
bin, seitdem mache ich (fast) alles in Python. Leicht zu lernen, die 
Programme sind sehr übersichtlich, plattformübergreifend. Schau Dich mal 
bei

http://www.python-kurs.eu/
http://www.python-forum.de/

und und mache ein paar Versuche, ich könnte mir gut vorstellen, dass Du 
schnell drin bist.

peg

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ich habe hier schon mal geschrieben, nachdem ich ein paar kleine 
hardwarenahe Progrämmchen auf dem Raspbery hinbekommen habe:

Ich halte Python für das BASIC des 21. Jahrhunderts, man kann das ganze 
objektorientierte Geschwafel geflissentlich ignorieren und damit 
gewöhnliche herkömmliche böse imperialistische Programme schreiben.

Also keinen falschen Respekt davor haben.

von Walter T. (nicolas)


Lesenswert?

"Head first Python" in der zweiten Auflage ist sehr gut geschrieben. Der 
Objektorientierte Ansatz kommt auch im letzten Drittel, es wird aber 
nicht darauf herumgeritten.

von M.K. B. (mkbit)


Lesenswert?

Häuptling Rauchender Kopf schrieb:
> Da ich OOP nicht leiden kann

Wenn du nur ein Script schreibst, was in der Konsole läuft, dann geht es 
auch fast ohne OOP oder du merkst es nicht.

Bei der GUI z.B. mit Tcl/Tk kommst du um OOP nicht drumrum. Dein 
Eingabefeld ist dann ein Objekt, mit dem du interagieren kannst.

von Kritical R. (kritical_r)


Lesenswert?

Gui programmierung ist ans system gebunden (win/linux) deshalb habe ich 
leider auch nur oop gefunden oder durch game engines .net sprachen.
mit JS und canvas kann man grafisch was machen und mit w3school lernen.
ich glaube die genauichkeit beim rechen ist da nicht so toll, es kann 
man googlen, da gibts probleme

sonst sind die bibliotheken und frameworks eher mit viel arbeit 
verbunden sich da einzuarbeiten, man könnte sfml davon die c variante 
probieren cfml , aber die doku ist nur für c++

es gibt noch eine alte gui programmier möglichkeit freebasic, auf der 
seite sind viele IDE's ein chat tuts und beispiele auf deutsch. man muss 
transparente bilder (PNG) erst durch ein script einbinden.

so richtig einfache komplette 2d game engines fallen mir keine ein, den 
die meisten sind etwas unpraktisch zum programmieren, da sie an 
einsteiger gerichtet sind und eher mit klicken oder blueprints 
funktionieren.

Phyton ist halt wegen dem interpreter etwas ungewöhnlich ist bei linux 
meist vorinstalliert aber bei windows???

vielleicht geht auch einfach was eigenes per openGL und C da muss man 
aber matrizen rechenen

: Bearbeitet durch User
von M.K. B. (mkbit)


Lesenswert?

Kritical R. schrieb:
> vielleicht geht auch einfach was eigenes per openGL und C da muss man
> aber matrizen rechenen

Ich denke das ist doch sehr übertrieben da mit openGL drauf loszugehen. 
Es geht hier doch nur um Textboxeb und Buttons.

Python bringt in der Standardinstallation tkinter mit. Das ist ein GUI 
Framework, das auf Windows und Linux läuft. Außerdem gibt es dazu 
Beispiele wie man da einfach Buttons und Textfelder kombiniert.

Kritical R. schrieb:
> Phyton ist halt wegen dem interpreter etwas ungewöhnlich ist bei linux
> meist vorinstalliert aber bei windows???

Es gibt Tools, mit denen lässt sich ein Pythonprogramm in eine exe 
packen, sodass man auf dem Zielrechner kein Python installieren muss.

von imonbln (Gast)


Lesenswert?

Häuptling Rauchender Kopf schrieb:
> Eine kurze Recherche ergab, dass Python einfach zu erlernen wäre und
> recht bekannt ist. Python kann offenbar objektorientiert oder auch nicht
> objektorientiert eingesetzt werden. Da ich OOP nicht leiden kann (bisher
> nur auf die Schnauze geflogen damit), würde ich gerne weiterhin ohne
> auskommen.
>
> Welche Werkzeuge benötige ich, womit muss ich anfangen?
> - GUI
> - Variablen händeln (evtl. Array, geht aber auch mit Variablen)
> - Bedingungen (if, Schleife etc.)

Ja Python ist ziemlich Anfänger geeignet. Ich bin sicher wenn man 
Programmieren kann, kommt man in Python ziemlich schnell rein. Sicher 
gibt es auch den einen oder anderen syntactic sugar aber denn muss man 
nicht kennen. Das Buch "automate the boring stuff with python" wurde mir 
von vielen als guter Start empfohlen, ich selbst habe es allerdings noch 
nicht gelesen, Mir selbst hat das Buch "Learning Python: Powerful 
Object-Oriented Programming" geholfen in die Sprache rein zu kommen.

Generell empfehle ich dir gleich mit Python3 Anzufangen, Python2 soll 
2020 in den Status EOL gehen, das Pferd Humpelt also schon.

Was dein Konkretes Vorhaben angeht. Wenn es Wirklich GUI sein soll dann 
sind die Tkinter Bindings schon beim cPython mit dabei und daher eine 
gute Wahl um schnell los zu legen. Schöner finde ich aber das Look&Feel 
von QT.

Wenn es noch etwas ganz anders sein darf, kann ich mir Dein Problem auch 
gut als Webapplikation vorstellen, dann Könntest du mit den Python Flask 
oder Django Framework dein Programm entwickeln und der Benutzer kann es 
mit einen Handelsüblichen Browser steuern.

von Sascha W. (sascha-w)


Lesenswert?

@Häuptling

welches OS? Wenn WIN ...

Für so einfache Sachen incl. GUI und mit Fähigkeiten Richtung Basic 
würde ich AutoIT empfehlen. Da hat man so was ruck zuck fertig und eine 
EXE kann man auch draus machen.

Sascha

von Nano (Gast)


Lesenswert?

Dein Problem kann man gut im Browser mit JavaScript, HTML und CSS lösen, 
optional kann man auch ein Webframework verwenden.

Damit bist du wesentlich flexibler und schneller am Ziel.

von Tanja Schmidt (Gast)


Lesenswert?

wenn Du vom Basic kommt wieso dann nicht Lazarus Pascal?
Da kannst Du alles mit amchen und das wichtigste die Prgrammierumgebung 
ist der Hammer und put of the Box, runerladen 
starten..Programmeiren..keine Progamme zusammensuchen keine Fumellei mit 
Eisntellung udn Pfaden etc pp
https://www.lazarus-ide.org

Damit kannst Du mit oer ohne OOP Schreiben, unter Win Linux Amiga OS etc 
pp
Und ganz nebenbei wird die Portierung für STM32 immer weiter entwickelt, 
so das Du später auch auf µC damit weiter arbeiten kannst

von Tanja Schmidt (Gast)


Lesenswert?

ach ja, und ansonsten ja, spricht nichts gegen Python.
Also würde ich zwischen Python oder Lazarus/Freepascal entscheiden

von Tanja Schmidt (Gast)


Lesenswert?

P.S. und keine Nerverei wegen irgendwelcher Lizenzen. Lazarus / 
Freepascal erlaubt problemlos kommerzielle Nutzung jeder Art, die 
bedingunen hierfür sind ein Witz, ich meine es war nur, das irgendwo in 
der Hilfe oder so stehen sollte das es mit Freepsacal geschrieben 
wurde..und bin mir nicht mal sicher ob das zwingend war.
Der Totalcommander ist in Lazarus geschrieben z.B.

von Blabla (Gast)


Lesenswert?

Hallo,
ich kann dir auch nur Python ans Herz legen. Allerdings solltest du 
deine unbegründete angst vor Objektorientierung überwinden. Datentypen 
wir Listen und Dictionaries sind schon Objekte. Sehr einfach zu 
verwenden und sehr mächtig.

Mein aktueller Favorit bezüglich Entwicklungsumgebung ist eine virtuelle 
Python Umgebung die ich mit miniconda erstelle, für code prototyping 
benutze ich JupyterLab und später PyCharm fürs refactoring um Klassen 
und Module zu bauen.

Pthon hat ein sehr einfaches GUI interface namens tkinter was sehr 
leicht zu verwenden ist und hier wahrscheinlich ausreicht. Alternativ 
gibt es das mächtige QT. Ich benutze zur Zeit Kivy, was ich allerdings 
einem Anfänger und OOP verweigerer nicht ans Herz legen würde.

Anstelle der GUI parameter auswahl kannst du auch ein einfaches JSON 
oder INI file schreiben und das mit einem fertigen Parser auslesen. So 
hast du auch gleich eine Referenz mit welchen parametern dein Programm 
gelaufen ist wenn du das file mit den ausgaben archivierst.

Python ist ein sehr mächtiges Werkzeug dank der vielen Bibliotheken. Es 
kann nicht schaden es zu lernen ;-)

von Bernd W. (berndwiebus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo Blabla.

Blabla schrieb:

> Pthon hat ein sehr einfaches GUI interface namens tkinter was sehr
> leicht zu verwenden ist und hier wahrscheinlich ausreicht.

Richtig. Und tkinter hat den Vorteil, das es so Plattformübergreifend so 
gut wie überall läuft. Es gehört zum Standardpacket von Python, und bis 
auf wenige Ausnahmen ist tkinter immer mit dabei, wenn man Python 
installiert.
Egal ob Linux, Windows oder Mac, Python/tkinter läuft.

Um mit Fenstern und Buttons herumzumachen ist es wohl in 95% aller Fälle 
ausreichend.

Siehe im Anhang Buttontest5.zip. Darin ist buttontest.py, ein Python3 
Skript und ein GIF enthalten. Es werden damit ein paar Möglichkeiten 
gezeigt, was man mit Python/tkinter und Buttons machen kann.

buttontest5.py und P600-Dioden2.gif sollten dabei immer im gleichen 
Ordner sein.

Obwohl tkinter z.b. keine Transparenz kennt, lässt sich Transparenz 
damit  per "stipple" faken.

Die Grenzen von tkinter werden erst bei sehr Grafiklastigen Anwendungen, 
wie zum Beispiel einem Gerberviewer erreicht.
(Negativ Beispiel: 
https://www.mikrocontroller.net/wikifiles/5/5a/PyGerberAnalyse_B5_13Jun2013.zip 
)

> Alternativ
> gibt es das mächtige QT. Ich benutze zur Zeit Kivy, was ich allerdings
> einem Anfänger und OOP verweigerer nicht ans Herz legen würde.

Objektorientierungs Verweigerer ist ein Begriff, den ich so nicht stehen 
lassen möchte. Ich würde lieber Objektorientierungs Vermeider schreiben. 
Obwohl mir die Theorie zur Objektorientierung und die Vorteile, die sie 
bietet geläufig und einsichtig sind, habe ich ein Problem damit, so 
etwas praktisch umzusetzten.

Und auch eine gewisse Übung stellt sich nicht ein. Es kostet mich 
Unmengen an Zeit, objektorientiert zu Arbeiten und wird, da ich dabei 
die Grenzen meiner Konzentrationsfähigkeit regelmäßig überschreite, sehr 
Ffhleranfällig.

Aber man kommt in Python/tkinter auch schon sehr weit, wenn man sich an 
der Objektorientierung weitestgehend vorbeihangelt.

> Python ist ein sehr mächtiges Werkzeug dank der vielen Bibliotheken. Es
> kann nicht schaden es zu lernen ;-)

Was ich bestätigen kann.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.dl0dg.de

: Bearbeitet durch User
von Tanja Schmidt (Gast)


Lesenswert?

wie groß bzw schnell/langsam sind eigentlich Python Programme wenn sie 
als .exe verpackt werden?
Schade ist halt, das es nie echte Executable sind
Wenn es eine GUI/RAd wie Lazarus Pascal gäbe und dann noch kleine 
ausführbare Files dabei rauskommen würden, wäre Python sicherlich eine 
ernsthafte Überlegung wert, so scheue ich aber den ernsthaften Umstieg 
und was mit PYthon in 10 Jahren ist..vielleicht hält der Hype 
an..zumindest sollte die Community mittlerweile so groß sein, das es 
selbst wenn es ein Nisschendasein tristen würde, vermutlich ausreichend 
Anwender weiterhin am laufen halten, so das diese Sorge unbegründet 
wäre..

von Dr. Sommer (Gast)


Lesenswert?

Tanja Schmidt schrieb:
> Schade ist halt, das es nie echte Executable sind

Wo ist das Problem? Unter Linux sind Python-Scripte echte ausführbare 
Dateien. Nur weil ein Programm im ELF oder PE Format vorliegt wird das 
nicht besser...

von Blabla (Gast)


Lesenswert?

Hi, ob Verweigerer oder Vermeider ist mir eigentlich egal, ich denke nur 
es ist schwierig an Objektorientierung vorbei zu kommen. Selbst ein 
String ist schon ein Objekt! Warum also die Augen davor verschliessen?

Ich finde es sehr nützlich OOP im Alltag einzusetzen und es macht mir 
das Leben eher leichter als schwerer, muß ja auch nicht jeder so 
empfinden. Bewusstes vermeiden stelle ich mir schwieriger vor als die 
Konzepte dahinter zu verstehen und anzuwenden.

Gerade bei dem Szenario was der TO beschrieben hat würde es sich 
anbieten seine verschiedenen Variablensätze in Klassen zu organisieren.

@Tanja
Ich kann dir leider nichts darüber sagen wie sich python als .exe 
verhält weil ich es noch nie gebraucht habe, aber schnell ist es! Sehr 
schnell sogar wenn man es richtig anstellt. Ich benutze es inzwischen 
als Matlab Ersatz wegen der besseren Performance die nahe an C ran kommt 
wenn man nummerische Berechnungen betreibt (Es stehen die gleichen 
Bibliotheken in C dahinter).
Python wird jetzt auch erst 30 Jahre alt, daher würde ich mir über die 
nächsten 10 eher keine sorgen machen.

von Stefan S. (Gast)


Lesenswert?

Blabla schrieb:
> Ich finde es sehr nützlich OOP im Alltag einzusetzen

Dein Name passt schon ganz gut.

Denn wer sich in den letzten 10 Jahren etwas umgesehen hat, wird wohl 
auf viel Kritik am OOP Konzept gestossen sein, insbesondere an Vererbung 
und dynamic dispatch. Viele der modernen Sprachen wie etwa auch Go-Lang 
vermeiden OOP ja eher, und auch von Entwicklern der AAA-Games gab es ja 
viel Kritik an OOP. Ich hatte den OOP Hype um 1990 auch voll mitbekommen 
und habe bis vor einigen Jahren auch versucht alles in Objekte zu 
quetschen und mit Vererbung und Methoden zu erschlagen, insbesondere 
auch im Ruby, dass ja noch mehr als Python auf OOP fixiert ist. Zum 
Thema etwa

https://medium.com/@cscalfani/goodbye-object-oriented-programming-a59cda4c0e53

oder

https://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

von Nano (Gast)


Lesenswert?

Tanja Schmidt schrieb:
> wie groß bzw schnell/langsam sind eigentlich Python Programme wenn sie
> als .exe verpackt werden?

Bei dem was der TS machen will, spielt Performance kaum eine Rolle.

Ansonsten kann man je nach Anwendungsfall ja messen.

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo Blabla.

Blabla schrieb:

> Hi, ob Verweigerer oder Vermeider ist mir eigentlich egal, ich denke nur
> es ist schwierig an Objektorientierung vorbei zu kommen. Selbst ein
> String ist schon ein Objekt! Warum also die Augen davor verschliessen?

Das ist Richtig. Aber ich verschliesse nicht die Augen davor, es klappt 
einfach im Kopf nicht mehr wie früher.

>
> Ich finde es sehr nützlich OOP im Alltag einzusetzen und es macht mir
> das Leben eher leichter als schwerer, muß ja auch nicht jeder so
> empfinden.

Ich "denke" sogar Opbjektorientiert. Das wird mir klar, wenn ich alte 
Notizen (zu allem möglichen, nicht nur Programmieren) durchlese, und 
meine verfälschte Erinnerung dazu bemerke. Die Versatzstücke der 
Konfabulation sind irgendwie stereotyp. So als wären es "Objekte", die 
an die Situation angepasst werden.

> Bewusstes vermeiden stelle ich mir schwieriger vor als die
> Konzepte dahinter zu verstehen und anzuwenden.

Wenn Du nicht verstehen kannst, dass Du etwas Verstehst, aber trozdem 
nicht Umsetzten kannst, dann kannst Du auch schlecht verstehen, dass 
Vermeiden einfacher sein kann. ;O)

>
> Gerade bei dem Szenario was der TO beschrieben hat würde es sich
> anbieten seine verschiedenen Variablensätze in Klassen zu organisieren.

Richtig.

> Ich kann dir leider nichts darüber sagen wie sich python als .exe
> verhält weil ich es noch nie gebraucht habe, aber schnell ist es!

Wie das unter Windows geht, weiss ich nicht, und unter Linux ist es so 
wenig nötig, dass es keiner macht.

Es ist aber möglich, in Python C Routinen einzubauen, wo das aus 
Geschwindigkeitsgründen opportun ist.

Was aber auch geht, ist Python in C zu übersetzten, und das dann ganz 
gewöhnlich als C-Programm zu compilieren.

Habe ich aber auch noch nicht selber gemacht. Aber ich kenne die 
betrüblichen Fälle von Leuten, die sich Software mit C-Quellen 
eingekauft haben. Die C-Quellen stellten sich aber dann hinterher als 
von einer anderen Programiersprache (Java oder Python oder noch 
irgendwas anderes) nach C übersetztes heraus. Das Compilieren 
funktionierte auch, und das Programm lief, aber die Quellen waren zur 
Weiterentwicklung unbrauchbar, weil total verknotet und in einer Weise 
geschrieben, wie es kein Mensch machen würde.

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.dl0dg.de

von Egon D. (Gast)


Lesenswert?

Stefan S. schrieb:

> Blabla schrieb:
>> Ich finde es sehr nützlich OOP im Alltag einzusetzen
>
> Dein Name passt schon ganz gut.

Wieso?
Was ist denn an seiner Aussage falsch?


> Denn wer sich in den letzten 10 Jahren etwas umgesehen
> hat, wird wohl auf viel Kritik am OOP Konzept gestossen
> sein, insbesondere an Vererbung und dynamic dispatch.

Hmm. Und?
Die Hysterie in den 90ern war genauso dämlich wie die
jetzige Verteufelung.

Das Problem liegt meiner Meinung nach darin, dass weder
der Erfinder der OOP selbst noch irgend einer seiner
Schüler und Missionare eine einfache und klare Erklärung
dafür gibt, WAS ein Objekt IST.
Liest man nach, hat man nicht mehr den Eindruck, es
ginge um Computerwissenschaften, sondern fühlt sich,
was den Grad des Geschwurbels angeht, in ein
philosophisches Seminar über vergleichende Literatur-
wissenschaft versetzt.

Dabei ist es ganz einfach. Das, was die Codierknechte
"Objekt" nennen, kennen die Theoretiker schon ziemlich
lange, und sie nennen es "Automat".
Ein Automat besteht aus einem Zustandsspeicher, z.B.
in Gestalt einer Flipflop-Batterie ("Felder", "Member-
variablen") und einer Kombinatorik ("Methoden", "Member-
functions"). Automaten sind ein klar definiertes Konzept:
Eingabealphabet, Ausgabealphabet, Menge der Zustände,
Überführungsfunktion, Ausgabefunktion. Alles was darüber
ist, ist vom Übel.

Vom historisch vorangehenden "Paradigma" der modularen
Programmierung unterscheidet sich die objektorientierte
Programmierung primär dadurch, dass man die Objekte
DYNAMISCH, d.h. zur Laufzeit erzeugen und wieder
vernichten kann, was mit klassischen "Modulen" nicht
möglich war. Deren Art und Anzahl stand zur Compilezeit
schon fest.

Alles andere, also z.B. die ereignisgesteuerte
Programmierung, oder die Vererbung und alles, was mit
ihr zusammenhängt, ist begleitenden Belletristik, die
mit der Kernidee der OOP nicht viel zu tun hat.
Die ganzen schrecklich komplizierten Probleme, die z.B.
mit der Vererbung zusammenhängen, sind Probleme, die sich
die OOP-Leute aufgrund ihres Hanges zur Übertreibung selbst
organisiert haben. Das hat mit der Quintessenz der objekt-
orientierten Programmierung nix zu tun.

Man kann auch eine gerade Linie vom "Paradigma" der
"strukturierten Programmierung" über die "modulare
Programmierung" hin zur "objektorientierten Programmierung"
ziehen: Die strukturierte Programmierung zielt auf die
Steuerstruktur des Programmes, also auf die Kombinatorik
des durch das Programm beschriebenen Automaten. Es handelt
sich aber i.d.R. noch um EINEN großen Automaten, weil die
Variablen, die die gesamte Programmlaufzeit leben, global
sind. Lokale Variablen sind auch temporäre Variablen; sie
entsprechen den elektrischen Wellenfronten, die durch die
Gatter der Kombinatorik hindurchlaufen.

Die modulare Programmierung zerlegt das Programm dadurch,
dass die Module gekapselt sind und private Variablen haben,
in ein NETZ von Automaten. Deren Art und Anzahl wird aber
bei der Programmübersetzung endgültig festgelegt.
Variablen, die die gesamte Programmlaufzeit leben, sind
NICHT mehr notwendigerweise global. Ein Modul hat keinen
direkten Zugriff auf den Zustand eines anderen Moduls.

Die objektorientierte Programmierung macht den Sack dann
insofern zu, als das Gesamtprogramm weiterhin als Automaten-
NETZ (und nicht als ein großer monolithischer Automat)
aufgefasst wird, Anzahl, Art und Verschaltung der Teil-
automaten, die dieses Automatennetz bilden, aber DYNAMISCH,
d.h. zur Laufzeit verändert werden kann.
Vererbung ist eine bequeme Sache, um eine größere Anzahl
untereinander ähnlicher Automatentypen strukturiert zu
beschreiben, aber man sollte aus der Vererbung keinen Kult
machen.

All das ist für einen Hardwaremenschen leicht vorstellbar.
Wenn zur Laufzeit ein neues Exemplar eines Objektes
hergestellt wird, dann ist das so, als würde er einen
weiteren HCT-Baustein aus dem Regal nehmen und in das
Steckbrett drücken. Vererbung ermöglicht Dinge wie "Ich
brauche etwas wie einen HC14, aber mit elf statt mit
sechs Invertern -- und außerdem sollen noch zwei
Flipflops drin sein". Bei realer Hardware ist das für
Normalsterbliche, denen keine Chipfabrik gehört, eine
Illusion -- aber in der Softwerkerei geht das.


> Ich hatte den OOP Hype um 1990 auch voll mitbekommen

Ich auch. Schrecklich.


> und habe bis vor einigen Jahren auch versucht alles in
> Objekte zu quetschen und mit Vererbung und Methoden zu
> erschlagen, [...]

Ich nicht.
Ich habe mich der Hysterie verweigert, durchaus auch zu
meinem eigenen Schaden. Dennoch konnte ich mich nicht
überwinden, mich durch diesen entsetzlichen Berg von
unverständlichem Geschwurbel, künstlichen Begriffen für
längst bekannte Sachverhalte und komplizierten Erklärungen
für einfache Konzepte hindurchzukämpfen.

Aber zum Glück scheint der Irrsinn ja abzuflauen, und die
Erklärungen haben ich mir inzwischen selbst entwickelt.

von Egon D. (Gast)


Lesenswert?

Bernd W. schrieb:

> Objektorientierungs Verweigerer ist ein Begriff, den
> ich so nicht stehen lassen möchte. Ich würde lieber
> Objektorientierungs Vermeider schreiben. Obwohl mir
> die Theorie zur Objektorientierung und die Vorteile,
> die sie bietet geläufig und einsichtig sind, habe
> ich ein Problem damit, so etwas praktisch umzusetzten.

Das glaube ich Dir auf's Wort.
Ich ziehe nur in Zweifel, dass DU der größere Teil
dieses Problems bist. :)
Vieles, was über OOP geschrieben wird, ist aus meiner
Sicht einfach hinrissiger Mist. Es ist nicht falsch,
aber völlig unnötigerweise irrsinnig kompliziert.


> Und auch eine gewisse Übung stellt sich nicht ein.
> Es kostet mich Unmengen an Zeit, objektorientiert zu
> Arbeiten

Dann hast Du den Kniff noch nicht gefunden, wie man sie
zweckmäßig anwendet (was in Anbetracht der üblichen
"Erklärungen" nicht verwunderlich ist). OOP soll ja
dem Programmierer das Leben vereinfachen -- und nicht
schwieriger machen.


> und wird, da ich dabei die Grenzen meiner
> Konzentrationsfähigkeit regelmäßig überschreite, sehr
> Ffhleranfällig.

Hmm, naja.
Ich verwende keine Hardcore-OOP-Sprache, also weder C++
noch Java; in der Regel bastele ich mit Tcl herum, was
ja nicht im eigentlichen Sinne objektorientiert ist.
"Echte" OOP, also so richtig mit Vererbung und so, hat
mir bisher nie gefehlt.

Was aber ECHT nützlich ist, das ist das Konzept der
Kapselung... also nicht nur Modularisierung im Sinne von
"der Quelltext besteht aus mehreren Teilen" sondern
Kapselung: Ein "Modul" bekommt seine Zustandsvariablen,
die zwar die gesamte Programmlaufzeit leben, auf die
aber von außerhalb des Modules nicht zugegriffen wird.
Von außen aufgerufen werden AUSSCHLIESZLICH die Methoden,
die bei Bedarf ihrerseits auf die Modulvariablen zugreifen
und diese ändern.
Der Charme dieser Methode besteht darin, dass ich den
genauen Aufbau der internen Datenstrukturen nicht kennen
muss, wenn ich von außerhalb irgendeine Aktion auslösen
will -- was meinem unzuverlässigen Gedächtnis EXTREM
entgegenkommt.

Das ist zwar im Sinne der reinen Lehre (noch) nicht
objektorientiert, aber das ist mir scheissegal, weil
es NÜTZLICH ist -- und es trainiert die Denkweise, in
"Automaten" zu denken.


> Aber man kommt in Python/tkinter auch schon sehr weit,
> wenn man sich an der Objektorientierung weitestgehend
> vorbeihangelt.

Naja... wenn Du mit Tk klarkommst (was ja offensichtlich
der Fall ist, wenn Du tkinter verwendest), weisst Du ja
schonmal, wie man Objekte verwendet, denn die Widgets
haben ja alle Merkmale von Objekten: Sie haben in der
Regel einen Zustand, den man von außen setzen und
abfragen kann, und man kann sie zur Laufzeit erzeugen
und vernichten. Alles da, was ein Objekt (=Automat)
braucht.
Ob das im Sinne der reinen Lehre "objektorientiert"
ist, ist mir sowas vom wumpe... das kannst Du Dir gar
nicht vorstellen... :)

von Dr. Sommer (Gast)


Lesenswert?

Egon D. schrieb:
> Automaten sind ein klar definiertes Konzept: Eingabealphabet,
> Ausgabealphabet, Menge der Zustände, Überführungsfunktion,
> Ausgabefunktion.

Allerdings ist bei Objekten die Zustandsmenge meistens unendlich groß. 
Bei "Automat" denkt man erstmal an "endlicher Automat", und genau das 
sind Objekte meist nicht. Die genannten Funktionen sind meist auch 
nicht-trivial und lassen sich kaum mit einem mathematischen Ausdruck 
angeben. Auch wenn deine genannten Elemente also prinzipiell existieren, 
lassen sie sich nur schwer formalisieren und am Code ablesen. Daher ist 
diese Abstraktion nicht so beliebt.

Stell dir die normale Java String Klasse vor. Die hat konzeptionell 
unendlich viele Zustände (d.h. sie ist so programmiert als hätte sie 
unendlich viele, tatsächlich ist sie durch die Plattform auf 16^64 
limitiert IIRC). Das sind so viele, dass man sich davon kein 
Zustandsdiagramm malen möchte. Was ist das Eingabealphabet? Das 
kartesische Produkt aller Member-Funktionen mit allen möglichem 
Eingabe-Parametern? Könnte man aufstellen, ist aber doch eher 
unhandlich. Die Übergangsfunktion ist trivial, da String immutable ist. 
Also auch eher nutzlos. Wenn man jetzt sagt OOP ist böse, frage ich 
mich, ist auch die String-Klasse böse? Nahezu jede Sprache außer C hat 
eine String-Klasse (selbst die Nicht-OOP-Sprachen), also irgendwie 
scheint OOP doch ganz nützlich zu sein.

Jetzt stell dir eine Klasse vor, welche einen kompletten Schaltplan 
enthält, z.B. für ein Simulationsprogramm. Die hat wieder eine Menge 
Unterobjekte, und die Zustandsmenge ist enorm unübersichtlich und 
konzeptionell unendlich. Für die Schaltung selbst könnte man natürlich 
gut eine Übertragungsfunktion angeben, aber für die Schaltplan-Klasse? 
Die hat vielleicht eine Funktion addElement, die hat 1 Zeile der Form 
Elements.add(...). Das ist relativ simpel, aber wie soll man das in der 
Automatentheorie abbilden? Erscheint mir wenig praktikabel.

So arbeiten nichtmal theoretische Informatiker, und die machen sonst 
viel mit endlichen und unendlichen Automaten...

Eine einfache praxisnahe Definition von Objekt wäre: eine Sammlung von 
Daten mit zugehörigen Funktionen, welche damit arbeiten. Die Funktionen 
stellen die Konsistenz der Daten sicher und kapseln die interne 
Darstellung.

von Udo K. (Gast)


Lesenswert?

Wenn du unter Windows arbeitest, kannst du das
Visual Studio verwenden.

Da kannst du das Windows API verwenden, in C oder Basic
programmieren, und das beste ist:
Du brauchst KEIN OOP, und die EXE hat gerade mal 20 kByte.

Der graphische Editor macht dir die Program Oberfläche praktisch
von alleine, du musst nacher nur mehr den Inhalt einfüllen.
Da gibt es in der mitgelieferten Hilfe auch gute Tutorials.

Wenn du auf Bloatware stehts, nimm Pyhon :-)

von Dr. Sommer (Gast)


Lesenswert?

Udo K. schrieb:
> Der graphische Editor macht dir die Program Oberfläche praktisch
> von alleine

Welcher grafische Editor von VS produziert denn Nicht-OOP Code? Noch 
dazu in C? Soweit ich mich erinnere ist das entweder für C# (total OOP) 
oder C++ mit MFC (ziemlich OOP). C mit Visual Studio macht überhaupt 
keinen Spaß, weil das nichtmal C99 unterstützt.

von Dr. Sommer (Gast)


Lesenswert?

Udo K. schrieb:
> Du brauchst KEIN OOP, und die EXE hat gerade mal 20 kByte.

Viel zu groß. Das Python-Programm
1
#!/usr/bin/python
2
print("Hello, World!")
ist 41 Bytes.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

Tanja Schmidt schrieb:
> wie groß bzw schnell/langsam sind eigentlich Python Programme wenn sie
> als .exe verpackt werden?
Das kommt drauf an. Mit PyInstaller (kann executables fuer Windows und 
Linux packen (ich glaube aber nicht als "cross-compiler")) kannst du

a) eine statische (grosse) exe bauen, die alles enthaelt (dein programm, 
pythoninterpreter und alle libs)

b) eine kleinere exe bauen, die dein Programm und den Pythoninterpreter 
enthaelt, dafuer aber die ganzen libs als extra dateien bei liegen.

Hier ein Beispiel:
1
#!/usr/bin/env python
2
3
def main():
4
    print("Hello World!")
5
6
7
if __name__ == '__main__':
8
    main()

Option a):
1
$ pyinstaller --onefile main.py
erzeugt eine einzige ausfuehrbare Datei, die hier bei mir auf Linux, 
~6MB gross ist.

Option b):
1
$ pyinstaller main.py
Der erzeugte Ordner ist ~13MB gross und enthaelt 50 Dateien:
1
$ tree dist/main/
2
dist/main/
3
|-- _bisect.cpython-37m-x86_64-linux-gnu.so
4
|-- _blake2.cpython-37m-x86_64-linux-gnu.so
5
|-- _bz2.cpython-37m-x86_64-linux-gnu.so
6
|-- _codecs_cn.cpython-37m-x86_64-linux-gnu.so
7
|-- _codecs_hk.cpython-37m-x86_64-linux-gnu.so
8
|-- _codecs_iso2022.cpython-37m-x86_64-linux-gnu.so
9
|-- _codecs_jp.cpython-37m-x86_64-linux-gnu.so
10
|-- _codecs_kr.cpython-37m-x86_64-linux-gnu.so
11
|-- _codecs_tw.cpython-37m-x86_64-linux-gnu.so
12
|-- _datetime.cpython-37m-x86_64-linux-gnu.so
13
|-- _hashlib.cpython-37m-x86_64-linux-gnu.so
14
|-- _heapq.cpython-37m-x86_64-linux-gnu.so
15
|-- _lzma.cpython-37m-x86_64-linux-gnu.so
16
|-- _md5.cpython-37m-x86_64-linux-gnu.so
17
|-- _multibytecodec.cpython-37m-x86_64-linux-gnu.so
18
|-- _opcode.cpython-37m-x86_64-linux-gnu.so
19
|-- _pickle.cpython-37m-x86_64-linux-gnu.so
20
|-- _posixsubprocess.cpython-37m-x86_64-linux-gnu.so
21
|-- _random.cpython-37m-x86_64-linux-gnu.so
22
|-- _sha1.cpython-37m-x86_64-linux-gnu.so
23
|-- _sha256.cpython-37m-x86_64-linux-gnu.so
24
|-- _sha3.cpython-37m-x86_64-linux-gnu.so
25
|-- _sha512.cpython-37m-x86_64-linux-gnu.so
26
|-- _socket.cpython-37m-x86_64-linux-gnu.so
27
|-- _ssl.cpython-37m-x86_64-linux-gnu.so
28
|-- _struct
29
|   `-- cpython-37m-x86_64-linux-gnu
30
|       `-- sotruct.cpython-37m-x86_64-linux-gnu.so
31
|-- _struct.cpython-37m-x86_64-linux-gnu.so
32
|-- base_library.zip
33
|-- binascii.cpython-37m-x86_64-linux-gnu.so
34
|-- grp.cpython-37m-x86_64-linux-gnu.so
35
|-- ld-linux-x86-64.so.2
36
|-- libbz2.so.1.0
37
|-- libcrypto.so.1.1
38
|-- libexpat.so.1
39
|-- liblzma.so.5
40
|-- libncursesw.so.6
41
|-- libpython3.7m.so.1.0
42
|-- libreadline.so.8
43
|-- libssl.so.1.1
44
|-- libz.so.1
45
|-- main
46
|-- math.cpython-37m-x86_64-linux-gnu.so
47
|-- pyexpat.cpython-37m-x86_64-linux-gnu.so
48
|-- readline.cpython-37m-x86_64-linux-gnu.so
49
|-- resource.cpython-37m-x86_64-linux-gnu.so
50
|-- select.cpython-37m-x86_64-linux-gnu.so
51
|-- termios.cpython-37m-x86_64-linux-gnu.so
52
|-- unicodedata.cpython-37m-x86_64-linux-gnu.so
53
|-- zlib
54
|   `-- cpython-37m-x86_64-linux-gnu
55
|       `-- soib.cpython-37m-x86_64-linux-gnu.so
56
`-- zlib.cpython-37m-x86_64-linux-gnu.so
57
58
4 directories, 50 files
Dafuer ist die ausfuehrbare Datei "nur" noch gut 1MB gross.

Wenn man mit einem Framework wie Qt arbeitet, dann wird der Ordner in 
Option b) auch schnell 100MB gross.

Das schoene an PyInstaller ist, dass man sich um nicht viel kuemmern 
muss. Einfach das main-Script angeben, fertig. PyInstaller sucht dann 
alle noetigen Libs zusammen.

Was die Performance angeht:
Die erzeugte exe ist nicht langsamer, als wenn du das Script normal 
ausfuehren lassen wuerdest.

Wenn man wirklich Performance Probleme hat (also nach dem man so 
wirklich alles aus Python rausgeholt hat), dann kann man immernoch 
Cython nehmen.

https://cython.org/
1
Cython is an optimising static compiler for both the Python programming
2
language and the extended Cython programming language (based on Pyrex). 
3
It makes writing C extensions for Python as easy as Python itself.
4
5
Cython gives you the combined power of Python and C to let you
6
7
write Python code that calls back and forth from and to C or C++ 
8
code natively at any point.
9
10
easily tune readable Python code into plain C performance by adding 
11
static type declarations, also in Python syntax.
12
13
use combined source code level debugging to find bugs in your Python, 
14
Cython and C code.
15
16
interact efficiently with large data sets, e.g. using multi-dimensional 
17
NumPy arrays.
18
19
quickly build your applications within the large, mature and widely 
20
used CPython ecosystem.
21
22
integrate natively with existing code and data from legacy, low-level 
23
or high-performance libraries and applications.
24
25
The Cython language is a superset of the Python language that 
26
additionally supports calling C functions and declaring C types on 
27
variables and class attributes. This allows the compiler to generate 
28
very efficient C code from Cython code. The C code is generated once 
29
and then compiles with all major C/C++ compilers in CPython 2.6, 2.7 
30
(2.4+ with Cython 0.20.x) as well as 3.3 and all later versions.

von Karl (Gast)


Lesenswert?

Ich verstehe die Leute nicht, die hier so gegen OOP sind. Nehmen wir 
einfach mal ein string in Python, der ein Objekt und kein char-array 
ist.

Machen wir eine Schleife über die Buchstaben:

for LETTER in STRING:

so einfach geht es in Python. In c braucht man eine Krüppelvariable zum 
zählen. Ich denke mit der Objektvariante hat das Gehirn weniger arbeit. 
In Python kann man sich auch selber festlegen, wie ein Objekt iterriert. 
Man ist bei OOP auch nicht gezwungen alles mit Vererbung zu machen. Wie 
immer das Werkzeug da einsetzen wo es sinnvoll ist.

von Stefan S. (Gast)


Lesenswert?

Karl schrieb:
> Ich verstehe die Leute nicht, die hier so gegen OOP sind. Nehmen wir
> einfach mal ein string in Python, der ein Objekt und kein char-array
> ist.
>
> Machen wir eine Schleife über die Buchstaben:
>
> for LETTER in STRING:

Nein gegen OOP muss man nicht sein, aber viele Leute sehen in OOP immer 
noch das einzig wahre, selig machende.

Dein obiges Codebeispiel hat mit OOP auch nicht viel zu tun, das wird 
allgemein als Iterator bezeichnet, ist sehr sicher und bequem zu nutzen 
und ist oft genauso effizient wie eine explizite Schleife.

Auch die angenehmere Schreibweise myString.length statt length(mystring) 
hat mit OOP nicht wirklich etwas zu tun, das ist einfach eine andere 
Syntax, seit D-Lang meist mit UFCS bezeichnet (Nim nennt es treffender 
Method-Call-Syntax), siehe

https://en.wikipedia.org/wiki/Uniform_Function_Call_Syntax

Nachteilig ist echte OOP etwa oft bei der Performance, wenn die Objekte 
alle auf dem Heap alloziert werden müssen und auf sie indirekt über 
Pointer zugegriffen wird. Der Cache wird dann kaum ausgenutzt, und die 
Performance kann drastisch sinken.

von Dr. Sommer (Gast)


Lesenswert?

Stefan S. schrieb:
> Nachteilig ist echte OOP etwa oft bei der Performance, wenn die Objekte
> alle auf dem Heap alloziert werden müssen

Wo müssen sie das? Selbst die JVM kann das optimieren.

Stefan S. schrieb:
> Der Cache wird dann kaum ausgenutzt,
In C++ z.B. kann std::vector alle Objekte hinereinander anlegen. Die 
Performance ist dann identisch zu der eines simplen Arrays.

von Stefan S. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Stefan S. schrieb:
>> Der Cache wird dann kaum ausgenutzt,
> In C++ z.B. kann std::vector alle Objekte hinereinander anlegen. Die
> Performance ist dann identisch zu der eines simplen Arrays.

Ja aber doch nur wenn die Objekte alle gleich groß sind. Bei OOP mit 
Vererbung sind die Objekte ja eben heterogen und belegen unterschiedlich 
viel Speicher, dann hat man im std::vector ja in der Regel nur die 
Pointer auf die Instanzen abgelegt.

von Dr. Sommer (Gast)


Lesenswert?

Stefan S. schrieb:
> Bei OOP mit
> Vererbung sind die Objekte ja eben heterogen und belegen unterschiedlich
> viel Speicher

Ja. Aber wie willst du diesen Fall ohne OOP effizienter abdecken? Mit 
"Variant"-artigen Datentypen? So wie std::variant? (Oh, wieder ein 
Objekt)

von Harald P. Otter (Gast)


Lesenswert?

> Wenn du auf Bloatware stehts, nimm Pyhon :-)

Ja nimm genau das: Pyhon
Und zeige mir nicht triviale SW welche e.g. kleiner 2MB installiert ist.

Alle Windows Updates (selbstverständlich auch Windows selbst) sind ja so 
bequem unbloatig weil der Hersteller eben NICHT auf Python setzt. Issia 
logisch.

von Stefan S. (Gast)


Lesenswert?

Man muss sich eben darüber klar sein, ob man Vererbung und diese 
heterogenen Objekte wirklich im konkreten Fall braucht. Und auch dann 
kann man Union-Types/ATD/Case-Variants oder wie auch immer das genannt 
wird nehmen, also ähnlich der Union bei C Structs. Die Objekte sind dann 
alle gleich groß, haben aber teilweise unterschiedlichen Inhalt. So 
verschwendet man etwas Speicherplatz, dafür liegen dann die Instanzen 
aber direkt hintereinander im Speicher, was die Cache-Effizienz stark 
verbessert. Natürlich geht das nicht immer, wenn man eine Liste/Array 
mit Objekten sehr unterschiedlicher Größe hat, dann macht echtes OOP 
Sinn.

von Dr. Sommer (Gast)


Lesenswert?

Stefan S. schrieb:
> Und auch dann
> kann man Union-Types/ATD/Case-Variants oder wie auch immer das genannt
> wird nehmen

Ja. Das geht in C++ z.B. mit std::vector<std::variant<TypA, TypB, 
TypC>>. In der einen Zeile werden 5 verschiedene Klassen benutzt. 
Objektorientierter geht's ja wohl kaum. Bevor man sich aber über so 
Dinge wie Cache-Effizienz sorgen macht sollte man natürlich messen, ob 
das wirklich der Flaschenhals im Programm ist. Sonst macht man es sich 
alles unnötig kompliziert.

von Stefan S. (Gast)


Lesenswert?

Stefan S. schrieb:
> kann man Union-Types/ATD/Case-Variants oder wie auch immer das genannt

Ah ja, sum types oder tagged union wird das allgemein genannt, siehe

https://en.wikipedia.org/wiki/Tagged_union

von Stefan S. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Ja. Das geht in C++ z.B. mit std::vector<std::variant<TypA, TypB,
> TypC>>. In der einen Zeile werden 5 verschiedene Klassen benutzt.

So weit bin ich mit meinen C++ Kenntnissen noch nicht vorgedrungen.

> Objektorientierter geht's ja wohl kaum. Bevor man sich aber über so
> Dinge wie Cache-Effizienz sorgen macht sollte man natürlich messen, ob
> das wirklich der Flaschenhals im Programm ist. Sonst macht man es sich
> alles unnötig kompliziert.

Das ist natürlich völlig richtig.

von Hans-Georg L. (h-g-l)


Lesenswert?

Stefan S. schrieb:
> Man muss sich eben darüber klar sein, ob man Vererbung und diese
> heterogenen Objekte wirklich im konkreten Fall braucht. Und auch dann
> kann man Union-Types/ATD/Case-Variants oder wie auch immer das genannt
> wird nehmen, also ähnlich der Union bei C Structs. Die Objekte sind dann
> alle gleich groß, haben aber teilweise unterschiedlichen Inhalt. So
> verschwendet man etwas Speicherplatz, dafür liegen dann die Instanzen
> aber direkt hintereinander im Speicher, was die Cache-Effizienz stark
> verbessert. Natürlich geht das nicht immer, wenn man eine Liste/Array
> mit Objekten sehr unterschiedlicher Größe hat, dann macht echtes OOP
> Sinn

Mit OOP  hast du die Möglichkeit die Objektverwaltung in eine eigene 
Klasse zu kapseln und diese für die die jeweile Anwendung zu optimieren.

Das kann z.B. so
> Dr. Sommer schrieb:
>> Ja. Das geht in C++ z.B. mit std::vector<std::variant<TypA, TypB,
>> TypC>>. In der einen Zeile werden 5 verschiedene Klassen benutzt.
>
oder wenn die Objekterzeugung und/oder der Speicherplatz der 
Flaschenhals  ist evtl mit Objekt-Pools gelöst werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.