XubuntuNaru
Anmeldungsdatum: 10. Dezember 2009
Beiträge: 93
|
So, ich lerne momentan die Programmierung mit Python mit Hilfe von "A Byte of Python" Ich verstehe das meiste auch und konnte es bereits umsetzen - wenn es aber an die objektorientierte Programmierung geht, versteh ich fast nichts mehr. Könnte mir das nochmal jemand, für einen Laien verständlich, erklären oder mir andere (online-) Literatur zu dem Thema empfehlen? (Momentan habe ich zu Hause noch kein Internet, es kann dementsprechend dauern, bis ich hier wieder antworte)
|
jakon
Lokalisierungsteam
Anmeldungsdatum: 16. November 2009
Beiträge: 419
|
Soweit ich das mit objektorientierter Programmierung versteh, kann man in eine Klasse mehrere Funktionen definieren, oder? Mit freundlichen Grüßen, jakon.
|
Fredo
Anmeldungsdatum: 27. Juni 2005
Beiträge: 5244
Wohnort: Bochum
|
Ich finde, das ist doch in dem Kapitel zur Objektorientierten Programmierung in ABoP ganz gut erklärt. Dort wird ja die Klasse "Person" eingeführt, um das Prinzip zu verdeutlichen. Die Idee ist einfach, dass man Objekte definieren kann, die
In vielen Fällen macht dies das Programmieren intuitiver. Man kann sich z.B. eine PDF-Bibliothek vorstellen, mit der man PDF-Dokumente laden, bearbeiten und speichern kann (ähnlich wie pdftk es macht). Mit objektorientierter Programmierung kann man dies recht angenehm umsetzen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | import pdflib
# Eine PDF-Datei einlesen
pdfdoc1 = pdflib.read('MeinPDF1.pdf')
# Eigenschaften, z.B.:
pdfdoc1.title
pdfdoc1.number_of_pages
# Eigenschaften können veränderbar sein:
pdfdoc1.author = 'Fredo'
# Es kann mehrere Objekte der gleichen Klasse geben:
pdfdoc2 = pdflib.read('MeinAnderesPDF.pdf')
# Objekte können Methoden haben, z.B. wollen wir die Titelseite von MeinPDF1.pdf auch dem zweiten Dokument voranstellen
titelseite = pdfdoc1.get_page(0)
pdfdoc2.insert_page(titelseite, position=0)
pdfdoc2.write('MeinAnderesPDFMitTitelseite.pdf')
|
Das ist nur ein Beispiel, verdeutlicht aber vielleicht die Idee dahinter. Ansonsten: Einfach mal ausprobieren, wenn man ein reales Problem hat. Ich finde, dass sich vieles auf diese Weise leichter und verständlicher umsetzen lässt, aber auch nicht alles. Der Vorteil von Python ist, dass man OOP verwenden kann, aber nicht muss. Liebe Grüße Fredo
|
Kinch
Anmeldungsdatum: 6. Oktober 2007
Beiträge: 1261
|
Ich kann leider keine Zeile Python. Aber die Motivation von Objektorientierung ist es einfach nur Verhalten und Daten zu kapseln, weil das sehr oft in der „echten Welt” vorkommt und eher dem menschlichen Denken entspricht. Es ist einfach nur ein Strukturierungsmittel. Mal ein Beispiel: Angenommen du willst mit rationalen Zahlen rechnen. Eine rationale Zahl besteht aus zwei Daten: Zähler und Nenner. Und einer Reihe von Operationen: Multiplikation, Division, Addition und Subtraktion. Ohne OO schreibst du eben an einer Stelle in deinem Programm die Funktionen auf und an anderer Stelle verwaltest du die Daten. Bsp: zahl1 = 2/3
zahl2 = 1/3
...
rat_add(zahl1,zahl2,ergebnis)
... Das funktioniert auch. Aber Verhalten und Daten die konzeptionell zusammen gehören, sind eigentlich getrennt. Ein Objekt besteht deswegen aus Daten und Funktion: zahl1 = 2/3
zahl2 = 1/3
...
ergebnis = zahl1.add(zahl2)
... Das macht bei diesem Minimalbeispiel keinen großen Unterschied. Aber solltest du jemals größere Programm schreiben, wirst du das durchaus zu schätzen wissen. Alles gehört zusammen, was zusammen gehört. Das ist nur die grundsätzliche Motivation. Es gibt noch viel mehr Konzepte in OO, aber die verwirren nur am Anfang.
|
AngelSoft
Anmeldungsdatum: 24. April 2007
Beiträge: 129
Wohnort: Franken
|
XubuntuNaru schrieb: Könnte mir das nochmal jemand, für einen Laien verständlich, erklären
Das ist hier m.E. recht knapp gut erklärt: http://de.wikipedia.org/wiki/Objektorientierte_Programmierung
oder mir andere (online-) Literatur zu dem Thema empfehlen?
z.B.:
http://openbook.galileocomputing.de/python/ oder
http://home.foni.net/~heikos/python/ und
http://home.foni.net/~heikos/tkinter/
|
YEPHENAS
Anmeldungsdatum: 8. Juni 2009
Beiträge: 352
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4563
Wohnort: Berlin
|
@AngelSoft: Argh, bitte nicht das OpenBook – gerade das OOP-Kapitel ist Schrott.
|
AngelSoft
Anmeldungsdatum: 24. April 2007
Beiträge: 129
Wohnort: Franken
|
Marc 'BlackJack' Rintsch schrieb: – gerade das OOP-Kapitel ist Schrott.
Da muss ich entschieden widersprechen!
|
XubuntuNaru
(Themenstarter)
Anmeldungsdatum: 10. Dezember 2009
Beiträge: 93
|
Danke für die Hilfe, habe jetzt einiges mehr verstanden! ☺ Aber ich verstehe immer noch nicht so ganz, was Klassen eigentlich sind und insbesondere nicht diese Sache mit "self".
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Kinch schrieb: ... Aber die Motivation von Objektorientierung ist es einfach nur Verhalten und Daten zu kapseln, weil das sehr oft in der „echten Welt” vorkommt und eher dem menschlichen Denken entspricht.
Ich muß dem leider widersprechen, weil man liest es so oft, dabei ist es - um es höflich auszudrücken - kompletter Unsinn. Wie oft hat man eine Klasse Person mit Attribut name und Methoden getName, setName? Mit der realen Welt hat das gar nichts zu tun. Die Eltern geben dem Kind den Namen, und dann kann man beim Amt noch eine Namensänderung beantragen, aber ich selbst kann mich nicht umbenennen. Fragen wie ich heiße kann man jeden - Nachbarn, Klingelschild, Postboten, Verwandte und Freunde. Nur ist es oft unhöflich den Betreffenden selbst zu fragen. Die Abstraktion ist überhaupt nicht an der Realität orientiert, nicht im Geringsten, sondern im Gegenteil ist die Abstraktion hochgradig artifiziell. In der Realität gibt es Redundanzen ohne Ende, wie das 'getName'-Beispiel zeigt. Beim Programmieren versucht man Redundanzen meist zu vermeiden. Die Märchen über OOP sind oft Marketinggewäsch, daß man hinterfragen muß. Image.getWidth? Wenn, dann frage ich einen Zollstock, wie breit ein Bild ist, aber nicht das Bild. ☺ Wann immer jemand im IT-Bereich "echte Welt" oder "Realität" sagt kann man die Stoppuhr stellen, bis Blödsinn folgt. ☺
Wenn jemand "virtuelle Welt" sagt wird es meist noch schlimmer. ☺ Und wenn Anführungsstriche oder sogenannt verwendet wird.
|
Kinch
Anmeldungsdatum: 6. Oktober 2007
Beiträge: 1261
|
Wie oft hat man eine Klasse Person mit Attribut name und Methoden getName, setName?
Ich gar nicht.^^ Hängt von der Programmiersprache ab, wie man das mit den Gettern und Settern löst.
Mit der realen Welt hat das gar nichts zu tun. Die Eltern geben dem Kind den Namen, und dann kann man beim Amt noch eine Namensänderung beantragen, aber ich selbst kann mich nicht umbenennen.
Es hat ja auch niemand behauptet, dass das eine 1:1-Abbildung sei. Natürlich hat eine Klasse „Person” keine Hunger und muss dann auf Toilette.
Trotzdem hast du ein Objekt mit dem sein Name assoziiert ist. Sowohl im Programm, als auch in der physischen Welt. Im Übrigen ist dein Personbeispiel etwas schlecht. Denn auch ein Person-Objekt ändert seinen Namen nicht spontan von selbst. Die Funktion „setName” teilt ihm nur mit, dass er jetzt einen anderen Namen hat.
Die Märchen über OOP sind oft Marketinggewäsch, daß man hinterfragen muß. Image.getWidth? Wenn, dann frage ich einen Zollstock, wie breit ein Bild ist, aber nicht das Bild. ☺
Also mich überzeugt das jetzt ehrlich gesagt nicht. Meiner Meinung nach gibt es sehr oft in der Praxis ein Zusammenspiel von Verhalten und Attributen. Die Breite eines Bildes ist ein Attribut. Du erfragst es von dem Bild. Von einem physischen Bild eben durch ein Zollstock und von einem Objekt eben durch eine Funktion (in dem Fall). Bei beiden hast du im Prinzip aber den gleichen Vorgang: Du erfragst von einem Objekt ein mit dem Objekt assoziiertes Attribut. Ich finde, dass das durchaus eine Entsprechung ist. Die Objektorientierung ist ein Mittel zur Programmstrukturierung. Das habe ich ja schon gesagt. Darüber hinaus ist sie meines Erachtens eine klare Annäherung an die physische Welt.
Wenn jemand "virtuelle Welt" sagt wird es meist noch schlimmer. ☺ Und wenn Anführungsstriche oder sogenannt verwendet wird.
Hm ja, aber zum Glück keine Zoll-Zeichen. 😛
|
Fredo
Anmeldungsdatum: 27. Juni 2005
Beiträge: 5244
Wohnort: Bochum
|
XubuntuNaru schrieb: Danke für die Hilfe, habe jetzt einiges mehr verstanden! ☺ Aber ich verstehe immer noch nicht so ganz, was Klassen eigentlich sind und insbesondere nicht diese Sache mit "self".
Klassen definieren, wie bestimmte Objekte funktionieren. "Klasse" ist dabei die allgemeine Funktion, das jeweilige Objekt nennt man dann "Instanz". Das Verhalten ist vielleicht am Beispiel deutlich geworden. Definieren würde man die PDF-Klasse in etwa so: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | class PdfDocument(object):
def __init__(self):
# Kram, um die grundlegenden Sachen vorzubereiten
self.pages = []
self.title = ''
self.author = ''
# Methoden
def get_page(self, pageno):
return self.pages[pageno]
def insert_page(self, page, position=None):
if position is None:
self.pages.append(page)
else:
self.pages.insert(position, page)
# Properties: Eigenschaften, die über Methoden ausgelesen und geändert werden
def get_number_of_pages(self):
return len(self.pages)
number_of_pages = property(get_number_of_pages)
|
Die Klasse definiert also, wie sich alle PDF-Objekte verhalten, pdfdoc1 und pdfdoc2 sind dann Instanzen der gleichen Klasse. Die verhalten sich gleich, haben aber unterschiedliche Daten/Eigenschaften, da sie unterschiedliche PDF-Dokumente repräsentieren. In der Klassendefinition bezeichnet self dabei die jeweilige Instanz selbst. Damit kann man in den Methoden auf die Eigenschaften der jeweiligen Instanz oder andere Methoden zurückgreifen. So guckt etwa get_number_of_pages nach, wie viele Seiten die konkrete Instanz hat: len(self.pages) . pdfdoc1.get_numer_of_pages() gibt daher die Anzahl der Seiten von pdfdoc1 zurück, etc. Properties sind dabei ein guter Weg, um die eigentlich unintuitiven sogenannten "Getter" und "Setter", die user unknown beschrieben hat, zu vermeiden bzw. zu verstecken. Bei einfachen Eigenschaften reicht es, etwa self.title direkt in einer Variable zu speichern, die an die Instanz gebunden ist. Bei komplexeren oder sich ändernden Eigenschaften (wie der Anzahl der Seiten, die ja z.B. von insert_page beeinflusst wird) benutzt man dagegen Methoden, um Eigenschaften auszulesen oder zu setzen. Das muss aber derjenige, der die Klasse einfach nur benutzen will, nicht wissen, daher nimmt man dann Properties. Ich hoffe, das hilft ein bisschen. Liebe Grüße Fredo
|
Kinch
Anmeldungsdatum: 6. Oktober 2007
Beiträge: 1261
|
XubuntuNaru schrieb: Aber ich verstehe immer noch nicht so ganz, was Klassen eigentlich sind
Ach ist doch ganz simpel: Klassen sind Objekte der Klasse „Klasse”.^^
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Nein, es geht mir nicht primär um getter und setter, sondern darum, daß OOP mitnichten der Versuch ist, die Realität realitätsgetreuer als andere Programmierparadigmen abzubilden - aber nicht, weil umgekehrt die anderen Sprachen besser darin wären, sondern weil es darum fast nie geht - bei Simulationen zu einem gewissen Grad vielleicht. Pacman z.B.; es gibt keinen Pacman in der Realität. Oder Webseiten - außerhalb des Computers gibt es keine Webseiten. Man mag sie ausdrucken, aber kann ncihts erreichen, wenn man auf die Links drückt. Und Datenbanken. Gab es sicher als Karteikarten vor den Rechnern, aber niemand würde versuchen Karteikarten realistisch abzubilden. Man interessiert sich für einen sehr schmalen Ausschnitt an Eigenschaften, den man abbildet, und wenn man am Rechner Möglichkeiten hat, die es in der Realität außerhalb des Rechners nicht gibt, dann kratzt einen das wenig. Oder ein Rockerverein mit Mitgliederverwaltung. Man möchte nicht die krumme Nase von Rick, oder das kurzatmige Schnaufen von Gustave-Gauloise abbilden. Man abstrahiert von der physisch erfahrbaren Realität und hat es von Beginn an mit abstrakten Konzepten zu tun: Mitgliedschaft, Beitrag, Mitgliederversammlung. Von der Versammlung interessiert nur das Datum, weil es in den Serienbrief muß, und der Ort, aber es gibt nicht die geringste weitere konkrete Ausgestaltung des Ortes als Ort, sondern es gibt nur einen Namen des Ortes "Hardrock Cafe, Harleyweg 9" beispielsweise, der als Text "kommt zum <$ORT> " eingesetzt wird. Jetzt kommt der Einwand: "Aber halt: Die Leute haben ein Navi! Man könnte schon die Koordinaten mitgeben, so daß die Leute einen Openstreetmap-Link bekommen usw.". Aber Openstreetmap ist auch nicht realer als das Programm, das man gerade schreibt. Auch klassische Koordinaten auf dem Globus sind nicht weniger abstrakt als ein Computerprogramm. Die Koordinaten des Hardrockcafes sind schon ein abstraktes Konzept, eine kollektive Phantasie, die über das Cafe gestülpt sind. Jetzt könnte der Einwand weitergehen: Das Cafe ist ein Treffpunkt, und soweit der Rockerclub sich nicht per Jabber im virtuellen Raum trifft, ist ein Treffen immer an einen physikalischen Ort gebunden, und das Konzept der Koordinaten insoweit universell, als man es jedem Menschen vermitteln kann. Es ist nicht so phantastisch wie z.B. Religion. Aber man wird genau diese physikalische Realität nicht in einer Mitgliederverwaltung abbilden wollen. Man wird, wo immer es geht, von der Realität absehen. Wenn man einen OSM-Link generieren will, und dafür Koordinaten speichert, dann wird man nur die reinen Zahlen speichern, und in der Tabelle den Spaltennamen und -kommentar gerade so wählen, daß ein verständiger Mensch verstehen kann, wozu diese da sind. Diese zusätzliche Information ist selbst wieder so abstrakt wie möglich gefaßt, nicht so real wie möglich. Mit settern und gettern hat das nur sehr entfernt zu tun.
|
FLoH.tar
Anmeldungsdatum: 6. Januar 2006
Beiträge: 470
|
Wenn man davon spricht, Objektorientierung bildet besser die Realität ab als andere Programmierparadigmen, ist damit nicht die konkret-physische, sondern die begriffliche Welt gemeint. Wenn ich "Katze" sage, dann meine ich damit nicht unbedingt das überfettete Vieh einer Bekannten, das auf einem Auge blind ist und aufgrund der platten Nase nicht ordentlich miauen kann, sondern ein (wahrscheinlich domestiziertes) Säugetier mit vier Beinen, spitzen Ohren und eleganten Sprungfähigkeiten,. Das ist der Unterschied zwischen Begriff und Symbol. Klassen sind Begriffe, Objekte Symbole. Klassen definieren die Gemeinsamkeiten und den Rahmen, indem sich die Objekte voneinander unterscheiden können. Wenn das Objekt gleich einem Symbol ist, muss ja auch ein Repräsentant dazugehören: Richtig, die Datenstruktur. Eine einfache tumbe Datenstruktur, die die statischen und dynamischen kennzeichnenden Eigenschaften des Objekts enthält. Anderes Ballspiel, die Biene. Klasse: Biene.
dieseBieneDieIchMeine = new Biene("Maja");
andereBiene = new Biene("Willi");
andereBiene.istBefreundetMit(dieseBieneDieIchMeine); In diesem Fall ist die Klasse "Biene" nicht nur abgeleitet von der Klasse "Insekt", wodurch uns etwa die Methode fliegt zur Verfügung steht. Sondern auch von der Klasse "ZeichentrickFigur", ihrerseits vielleicht abgeleitet von "Vermenschlicht", Anbieter der Funktion istBefreundetMit.
|