OOP Sprachgebrauch - Wie sagt man es richtig?

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 4. März 2008, 13:52

Drei Fragen dazu:

Im Python-Tutorial kann man nachlesen, dass alles, was mit einem Punkt an ein Objekt angehängt wird, "Attribut" heißt.
Außerhalb der Python-Welt scheint es aber doch eher üblich zu sein, nur bei Datenattributen von Attributen und bei Methodenattributen schlicht von Methoden zu sprechen. Rein vom dt. Sprachgebrauch her halte ich letzteres auch für naheliegender, weil Attribut ja doch eher eine Eigenschaft bezeichnet, wohingegen Methode etwas mit Tätigkeit zu tun hat.

Wie machen das nun die richtigen Pythonianer (ich will ja erst noch einer werden ...)?

UND (das betrifft jetzt aber nicht Python speziell): Heute habe ich beim Lesen eines Python-Buches mittlerweile die vierte (mindestens) Schreib-/Sprechweise für den Vorgang der "Instanzbildung" gelesen und allmählich wüsste ich gerne, was denn nun korrekt ist:
instanziieren
instantiieren
instantisieren
instanzieren

UND: Im OOP-Sprachgebrauch wird ja "Objekt" häufig synonym zu "Instanz einer Klasse" gebraucht. Da in Python - wenn ich es richtig verstanden habe - aber nahezu alles ein Objekt ist - auch "Dinge", die nicht als Instanz einer Klasse entstanden sind - , ist es da nicht vernünftig, in Python Instanzen einer Klasse eher nicht als Objekt, sondern als Instanz zu bezeichnen, um dadurch eindeutig zum Ausdruck zu bringen, um welche Art von Objekt es sich handelt?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 4. März 2008, 14:35

pütone hat geschrieben:Im Python-Tutorial kann man nachlesen, dass alles, was mit einem Punkt an ein Objekt angehängt wird, "Attribut" heißt.
Außerhalb der Python-Welt scheint es aber doch eher üblich zu sein, nur bei Datenattributen von Attributen und bei Methodenattributen schlicht von Methoden zu sprechen. Rein vom dt. Sprachgebrauch her halte ich letzteres auch für naheliegender, weil Attribut ja doch eher eine Eigenschaft bezeichnet, wohingegen Methode etwas mit Tätigkeit zu tun hat.
In Python gibt es aber keine Datenattribute oder irgendwelche anderen Attribute. Alle Attribute sind gleich, daher ist es sinnvoll von Attributen zu sprechen. Einige dieser Attribute sind "callable", aber das macht eigentlich keinen Unterschied, da Funktionen in Python sowieso immer höherer Ordnung sind und sich daher genau so wie andere, nicht "callable" Attribute verhalten. Sie haben sogar einen Typ :) Du kannst natürlich die beiden unterschiedlich benennen, aber letztendlich ist es nur eine künstliche Unterscheidung.
pütone hat geschrieben:UND: Im OOP-Sprachgebrauch wird ja "Objekt" häufig synonym zu "Instanz einer Klasse" gebraucht. Da in Python - wenn ich es richtig verstanden habe - aber nahezu alles ein Objekt ist - auch "Dinge", die nicht als Instanz einer Klasse entstanden sind - , ist es da nicht vernünftig, in Python Instanzen einer Klasse eher nicht als Objekt, sondern als Instanz zu bezeichnen, um dadurch eindeutig zum Ausdruck zu bringen, um welche Art von Objekt es sich handelt?
Was ist denn in Python keine Instanz einer Klasse? Eine Klasse ist die Instanz ihrer Metaklasse, falls du das im Hinterkopf hast. Auch None ist die Instanz einer Klasse. Und was nicht eine Instanz einer Klasse ist, ist in Python auch kein Objekt - also die Keywords zum Beispiel.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 4. März 2008, 14:57

Leonidas schreibt:
In Python gibt es aber keine Datenattribute oder irgendwelche anderen Attribute. Alle Attribute sind gleich, ...
Ich zitiere dazu aus dem Python-Tutorial:
9.4 Random Remarks
Data attributes override method attributes with the same name ...
Das passt dann für mich aber nicht zusammen.
BlackJack

Dienstag 4. März 2008, 15:45

Das ist dann halt die etwas kürzere Schreibweise für: "Attribute die ein Datum enthalten, dass keine Methode dieser Klasse sein muss, überschreiben Attribute die Methoden dieser Klasse sind und den selben Namen haben…"

Da auf Objekten alles Attribut ist und Klassen auch Objekte und Instanzen ihrer Metaklassen sind, stell Dir doch einfach mal vor man würde nicht diese ungenauen Verallgemeinerungen machen, sondern immer alles ganz korrekt ausformulieren. Dann würde niemand mehr die Doku lesen wollen. ;-)

Die "harte" Unterscheidung Daten-Attribute und Methoden ausserhalb der Python-Welt kommt aus der Welt der Sprachen, bei denen Klassen und Methoden statischer Code sind und Instanzen und Daten-Attribute im Gegensatz dazu zur Laufzeit verändert werden können. In Python sind auch Klassen Instanzen, und die Methoden verhalten sich zur Laufzeit wie Daten-Attribute: Man kann sie abfragen, herumreichen und sogar verändern. In Python ist diese Grenze also verwischt.

Zur "instanzieren"/… Frage: Das Wort gibt's im Deutschen eigentlich nicht, sowie "Instanz" eine im Grunde falsche Übersetzung von "instance" ist. Das meint im englischen nämlich "Exemplar" oder "Beispiel" und nicht die Instanz. Ein Grund warum ich zum Exemplar einer Klasse eher Objekt sage, statt "Instanz". Das ist wenigstens nicht ganz so falsch.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 4. März 2008, 15:49

pütone hat geschrieben:Ich zitiere dazu aus dem Python-Tutorial:
9.4 Random Remarks
Data attributes override method attributes with the same name ...
Das passt dann für mich aber nicht zusammen.
Es gewinnt das, was zuletzt definiert wird:

Code: Alles auswählen

>>> class Demo(object):
...     def __init__(self):
...         self.data_arg = 'Attribut'
...     def post_init(self):
...         self.data_arg = self.method
...     def method(self):
...         return 'Methode'
... 
>>> d = Demo()
>>> d.data_arg
'Attribut'
>>> d.post_init()
>>> d.data_arg()
'Methode'
>>> 
Was das Tutorial meint ist folgendes:

Code: Alles auswählen

>>> class Demo2(object):
...     def __init__(self):
...          self.data_arg = 'Attribut'
...     def data_arg(self):
...          return 'Method'
... 
>>> d2 = Demo2()
>>> d2.data_arg
'Attribut'
Das ist aber auch ganz logisch. Zuerst wird die Methode ``data_arg`` definiert, denn du kannst auf sie bereits in ``__init__`` zugreifen. Danach wird in ``__init__`` die Methode mit einem String überschrieben. Das ist eben das "override". Es wird beides definiert, nur das letze gewinnt eben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dienstag 4. März 2008, 16:03

BlackJack hat geschrieben:Zur "instanzieren"/… Frage: Das Wort gibt's im Deutschen eigentlich nicht, sowie "Instanz" eine im Grunde falsche Übersetzung von "instance" ist. Das meint im englischen nämlich "Exemplar" oder "Beispiel" und nicht die Instanz.
Diese Problematik war mir bewusst. Aber irgendwie muss ich die Sache ja auch im Deutschen richtig ausdrücken können müssen.
BlackJack hat geschrieben: Ein Grund warum ich zum Exemplar einer Klasse eher Objekt sage, statt "Instanz". Das ist wenigstens nicht ganz so falsch.
Aber wie beschreibst du den Vorgang der Instanzbildung?
"Objektifizieren" wirst du ja sicher nicht sagen.

UND: Gerade in Python, wo eben auch Klassen selbst Objekte sind, bekommt man dann eine sprachliche Ungenauigkeit, wenn man von Klassenobjekten spricht, weil nicht mehr klar ist, ob man das Exemplar einer Klasse oder die Klasse als Objekt meint. Da ist Klasseninstanz doch eindeutiger, oder nicht?

Und dann nochmal zu den Attributen: Ich denke ich habe verstanden, warum Attribute in Python Attribute sind - und eben NUR Attribute. Aber wäre es nicht dennoch sinnvoll, den außerhalb von Python üblichen (?) Sprachgebrauch zu verwenden, um sich mit anderen klarer verständigen zu können?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 4. März 2008, 16:10

pütone hat geschrieben:Und dann nochmal zu den Attributen: Ich denke ich habe verstanden, warum Attribute in Python Attribute sind - und eben NUR Attribute. Aber wäre es nicht dennoch sinnvoll, den außerhalb von Python üblichen (?) Sprachgebrauch zu verwenden, um sich mit anderen klarer verständigen zu können?
Also quasi so zu tun als gäbe es in Python so eine Trennung die es nicht gibt? Ich sehe da keinen Vorteil darin. Python ist eben eine eigenständige Sprache, mit eigenständigen Features. Wenn man anfangen würde, alle Python-Features so zu umschreiben, dass auch Java-Programmierer es verstehen ist den java-Programmierern geholfen, den Python-Programmierern geschadet, weil dann die Nomenklatur, hmm, "degeneriert", also verschiedene Begriffe das gleiche bedeuten. Oder andersrum, dass der gleiche Begriff verschiedene Bedeutungen haben kann.

Außerdem, List Comprehensions? Deskriptoren? Dekoratoren? Das in Java-Sprache zu übersetzen wird hart.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Mittwoch 5. März 2008, 11:13

@pütone: Die "Instanzbildung" beschreibe ich mit "ein Objekt erzeugen" statt "ein Objekt instanziieren". Bei "erzeugen" weiss ich auch immer auf Anhieb wie man's schreibt und bin bei der Schreibweise auch recht konsequent. Um mal meinen ehemaligen Deutsch-Lehrer zu zitieren «Wenn man nicht weiss wie "Portemonnaie" geschrieben wird, verwendet man halt "Geldbörse"» ;-)

Ich bin dann auch gerne mal ungenau wenn ich zum Beispiel von einem `Foo`-Objekt spreche und damit nicht die `Foo`-Klasse meine, sondern Objekte vom Typ `Foo`. Wenn ich die Klasse selbst meine, dann: `Foo`-Klasse.

Bei den Attributen wird auch bei Python in gewissen Grenzen der in anderen Sprachen übliche Sprachgebrauch verwendet, weil die Unterscheidung zwischen "Methoden" und "anderen Daten" schon wichtig ist. Es ist halt nur wichtig zu erkennen, dass das eine Kopf- und Konventionssache ist, und keine technische Trennung wie zum Beispiel in Java. Was dazu führt, das z.B. viele Java-Programmierer über diese künstliche Trennung noch nie nachgedacht haben, das ist halt so und geht ja auch nicht anders. Aber die glauben ja auch, das OOP ohne Klassen nicht geht. :-)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Donnerstag 6. März 2008, 06:58

Ich muss mich gerade mal selbst zitieren ...
pütone hat geschrieben: Heute habe ich beim Lesen eines Python-Buches mittlerweile die vierte (mindestens) Schreib-/Sprechweise für den Vorgang der "Instanzbildung" gelesen und allmählich wüsste ich gerne, was denn nun korrekt ist:
instanziieren
instantiieren
instantisieren
instanzieren
BlackJack hat mittlerweile ja erläutert, warum und wie er es schafft, keinen dieser vier Begriffe zu verwenden. Fand ich auch hilfreich.

ABER: Ich will es immer noch wissen! Einige von euch haben doch OOP an der Uni gelernt (schätze ich mal): Was sagen die denn da? Oder vielleicht gibt es einen Linguisten unter euch, der aus sprachwissenschaftlicher Sicht da etwas Erhellendes sagen kann.
Leonidas hat geschrieben: Also quasi so zu tun als gäbe es in Python so eine Trennung die es nicht gibt? Ich sehe da keinen Vorteil darin. Python ist eben eine eigenständige Sprache, mit eigenständigen Features. Wenn man anfangen würde, alle Python-Features so zu umschreiben, dass auch Java-Programmierer es verstehen ist den java-Programmierern geholfen, den Python-Programmierern geschadet, weil dann die Nomenklatur, hmm, "degeneriert", also verschiedene Begriffe das gleiche bedeuten. Oder andersrum, dass der gleiche Begriff verschiedene Bedeutungen haben kann.

Außerdem, List Comprehensions? Deskriptoren? Dekoratoren? Das in Java-Sprache zu übersetzen wird hart.
Das letzte trifft m.E. nicht (mehr) den Punkt. Es geht ja nicht darum, Worte für Sprachelemente zu finden, die es in dieser Art gar nicht gibt, sondern den Sprachgebrauch so zu wählen, dass er sich möglichst einfügt in einen schon bestehenden Sprachgebrauch, mittels dem man sich per Konvention ganz gut - programmiersprachenübergreifend - verständigen kann.

Ein Lösung könnte doch z.B. (gewesen) sein, statt den Begriff "Attribut" als Oberbegriff für das zu verwenden, was man in anderen Programmiersprachen als Attribute und Methoden unterscheidet, dafür einen neuen Begriff zu verwenden - da kann ja mal kreativ sein (ich mache jetzt mal lieber keinen Vorschlag, sonst wird der mir in Kürze um die Ohren gehauen ...). Dadurch hätte man zumindest vermieden, dass ein und derselbe Begriff "Attribut" in Python eine andere Bedeutung hat als in anderen OOP-Sprachen, ohne die Eigenart von Python aufgeben zu müssen.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Donnerstag 6. März 2008, 09:42

Ich weiß nicht, wo du da das Problem siehst. Eine Methode ist eine Methode auch in Python und ein Attribut ein Attribut. Das eine Methode gleichzeitig auch ein Attribut ist - ok, aber das heißt nicht, dass man eine Methode immer Attribut nennen muss.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 6. März 2008, 10:32

pütone hat geschrieben:Es geht ja nicht darum, Worte für Sprachelemente zu finden, die es in dieser Art gar nicht gibt, sondern den Sprachgebrauch so zu wählen, dass er sich möglichst einfügt in einen schon bestehenden Sprachgebrauch, mittels dem man sich per Konvention ganz gut - programmiersprachenübergreifend - verständigen kann.
Ich finde, dass man sich da dennoch ganz gut verständigen kann. Denn Methode versteht man in Python ja auch, nur eben als Sonderfall eines Attributes.
pütone hat geschrieben:Ein Lösung könnte doch z.B. (gewesen) sein, statt den Begriff "Attribut" als Oberbegriff für das zu verwenden, was man in anderen Programmiersprachen als Attribute und Methoden unterscheidet, dafür einen neuen Begriff zu verwenden - da kann ja mal kreativ sein (ich mache jetzt mal lieber keinen Vorschlag, sonst wird der mir in Kürze um die Ohren gehauen ...). Dadurch hätte man zumindest vermieden, dass ein und derselbe Begriff "Attribut" in Python eine andere Bedeutung hat als in anderen OOP-Sprachen, ohne die Eigenart von Python aufgeben zu müssen.
Ja, aber neue treffende Begriffe einzuführen ist nicht ganz einfach, denn die müssen ja erst von den Leuten akzeptiert werden. Attribut bezeichnet es ja schon ganz gut: als Daten die einer Klasse zugeordnet sind. Methoden sind nur in Python-Sicht auch Daten einer Klasse (und eigentlich ist das ja auch nur logisch), also ist der Begriff aus Python-Sicht sehr treffend.

Es steht dir ja frei von Attributen und Methoden zu sprechen (ich werfe sogar noch die bound und unbound methods ein), nur ist das dann einfach Konvention und keine technische Maßnahme. Ich habe sicher auch schon öfters von Methoden in Python gesprochen, fühle mich jetzt aber kein bisschen schuldig ;) Von Attributen zu sprechen ist dann am meisten sinnvoll, wenn man die Methoden in Klassen überschreibt oder wie "Variablen" betrachtet, dann fühlt es sich nicht wie ein Bruch im Konzept an, sondern ist konsistent.

Letztendlich muss ich sagen, dass das für mich eine eher wenig relevante Angelegenheit ist - es ist nur ein Name. Was ich wichtiger finde ist, dass OOP nicht eine kanonische Ausprägung hat (und diese von Java implementiert wird), sondern das OOP in verschiedenen Sprachen verschieden aussehen kann.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Donnerstag 6. März 2008, 11:32

@pütone: Der Prof, der bei mir damals im zweiten Semester OOP mit Java eingeführt hat, hat das mit der "Nichtübersetzung" von "instance" erklärt, und soweit ich mich erinnern kann, auch immer recht konsequent Objekt, Exemplar, oder Ausprägung zu "Instanzen" gesagt.

Ich denke der letzte Absatz von Leonidas' Beitrag beschreibt's ganz gut: Man kann OOP mit vielen verschiedenen Begrifflichkeiten erklären und auch die Semantik kann durchaus verschieden sein. Du musst einfach nur mal über den Tellerrand von C++/Java/C# hinaus schauen und Du wirst noch viel mehr Bezeichnungen und unterschiedliche Implementierungen vom OOP-Konzept finden, die man begrifflich einfach nicht unter einen Hut bekommt.

In einigen Sprachen werden (Daten)Attribute und Methoden technisch unterschieden, in anderen nicht. Es gibt solche bei denen Objekte nur Methoden haben und Daten etwas internes sind. Oder welche wo es ausschliesslich Objekte gibt, denen man Nachrichten schicken kann, wobei die Nachrichten selbst wieder Objekte sind. Oder welche wo man die Methoden im Sprachgebrauch nicht Objekten zuordnet sondern zu generischen Funktionen (so'ne Art Funktionssignatur) hinzufügt.

Bei denen allen eine gemeinsame, eindeutige Begriffswelt zu etablieren ist nahezu unmöglich. Schlimmer noch, man müsste viele neue Begriffe erfinden, weil man tunlichst vermeiden sollte den gleichen Begriff in zwei Sprachen mit unterschiedlichen Konzepten oder Ideen zu belegen. Man dürfte dann zum Beispiel nicht Klasse zu den Klassen in Python und Java sagen. Wenn man allerdings ständig neue Worte erfindet, ist die Kommunikation ja noch schlechter, weil die eine Seite die andere nicht einmal ansatzweise versteht, ohne in eine völlig neue Begriffswelt ein zu tauchen.

Wer soll ausserdem entscheiden wessen Bezeichnungen "richtig" sind und bleiben dürfen und welche durch neue ersetzt werden. Warum sollte man in Python das "Attribut" umbenennen, warum nicht in Java? (Info am Rande: Python ist 4 Jahre älter als Java.)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Donnerstag 6. März 2008, 14:55

Ich gehöre auch zu denen, die "instance" mit Exemplar übersetzen, weil "Instanz" im Deutschen etwas komplett anderes bedeutet. Statt eine deutsch aussehende leere Worthülse zu schaffen, sollte man lieber einen Begriff wählen, der bedeutungskompatibel ist und das trifft auf Exemplar oder Ausprägung zu.

Ansonsten: Objekt ist definitiv kein Synonym zu Exemplar, denn Klassen sind ein Implementationsdetail, welches nicht jede objektorientierte Programmiersprache kennt.

Die beste Begründung hat pütone selbst angegeben. Python nennt (genau wie Lisp im übrigen) alle Werte Objekte, egal ob es Exemplare von Klassen sind oder nicht. In neuen Python-Varianten verschmilzt dieser Unterschied, aber das Ur-Python macht den Unterschied sehr schön und nur etwas vom Typ "instance" ist Exemplar einer Klasse, repräsentiert durch ein Objekt vom Typ "classobj".

Ein Klassenobjekt ist übrigens ein Objekt, das eine Klasse repräsentiert, also das Exemplar einer Klassen-Klasse. Eine andere Bedeutung habe ich noch nie irgendwo gesehen. Die anderen Objekte heißen Exemplare der Klasse (nicht des Klassenobjekts, das würde die Konzeptebene und die Implementationsebene wieder vermischen).

Gegen den Begriff Attribut ist IMHO nichts zu sagen. Java nennt diese "fields", C++ wohl "members". Smalltalk kennt so etwas gar nicht, da gibt es nur Exemplarvariablen und Methoden, die man dann zum Zugriff benutzen kann. Gerne benutzt wird auch der Begriff properties (Eigenschaften), denn generischer geht's kaum noch. Sprachen aus der Self-Familie oder CLOS nennen's slot. Da fällt es schwer, einen guten deutschen Begriff zu finden. Denn Objekte in Spalten oder Schlitzen zu stecken wirkt komisch ;)

Was mir bei Python übrigens gefällt ist, dass nicht zwischen "member variables" und "member function" unterschieden wird, sondern dass es nur ein Konzept mit Attributen gibt. Steckt da eine Funktion drin, und ist das, wo es drin steckt eine Klasse, wird's automatisch eine Methode. Self oder Io machen das noch expliziter, indem sie von der Aktivierung eines Objekts sprechen und Funktionsobjekte dort aktiviert werden, wenn man sie aus einem Slot ausliest. Tatsächlich wird alles aktiviert, nur das andere Objekte auf die Aktivierung nicht gesonders reagieren. Nur Funktionen werden dann zu Closures. Methoden sind nämlich nichts anderes als Funktionen, die über einem Objekt abgeschlossen sind. Python macht die Bindung über self dabei wieder sehr explizit.

PS: Wenn schon jemand die kanonischen Begriffe definiert, dann weder Java noch Python, denn Smalltalk ist noch älter. Und der Begriff Objekt wurde wie gesagt noch viel früher bereits benutzt, das OO-Paradigma jedoch mit/für Smalltalk von Alan Kay begründet.

Stefan
BlackJack

Donnerstag 6. März 2008, 16:05

Genau betrachtet ist Objekt kein Synonym für Exemplar, aber es wird oft so verwendet. Auch von mir, um Fragen aus dem Weg zu gehen, was denn ein Exemplar sei. Von "Ausprägung" fange ich erst gar nicht an. Es gibt ja Leute die sich schon über "Sicht" für "view" aufregen ─ möchte nicht wissen was die zu "Ausprägung" sagen. ;-)

Ich denke die "slots" kann man auch sinngemäss mit "Fächer" übersetzen. Zumindest bei dem Bild mit den Objekten, die Nachrichten austauschen, kann man sich an der Stelle bei jedem Objekt eine Reihe (beschrifteter) Briefkästen oder Fächer vorstellen, wo diese Nachrichten(-Objekte) zur Verarbeitung eingeworfen werden.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 8. März 2008, 10:08

Es geht bei Slots weniger um die Empfänger von Nachrichten sondern um das Speichern von Objekten (bzw. deren Referenzen) in anderen Objekten. Man steckt ein Objekt in ein anderes, bildlich gesprochen, und dafür kann man natürlich etwas wie einen Schlitz oder Schacht benutzen, damit's auch festklemmt nicht wieder herausfällt ;)

Stefan
Antworten