okay, vielen Dank an alle für die Bemühungen.
Aber zurück zu dem Modul codecs. Das Modul codecs ist hier also tatsächlich ein Objekt.
Wo und wann wurde dieses Objekt codecs aber instantiiert, und aus welcher Klasse? Ist diese Frage überhaupt berechtigt?
Ich habe nämlich ein bisschen gegoogelt, bin dann auf die Aussage "in Python ist alles Objekte" gestoßen.
Also, momentan identifiziere ich den Begriff Objekt immer mit folgenden Eigenschaften?
1. Es MUSS eine Klasse geben, die quasi Grundgerüst dieses Objekts ist
2. Es können Variablen und Methoden dieses Objekts geben.
Also, Objekt in dem Sinne der Sprache C++ oder Java.
Vielleicht muss ich eine weitere Sichtweise haben, um es besser zu verstehen, was ein Objekt ist?
Ich bin dankbar für die Hilfe.
Grüße,
Eure Ratna
Deutsche Bücher vs. englische Bücher
@ratna_fong: In Python hat zwar jedes Objekt auch eine Klasse, das ist aber aus objektorientierter Sicht nicht zwingend notwendig. Es heisst ja objektorientiert und nicht klassenorientiert. Es gibt auch Programmiersprachen die nur Objekte, aber keine Klassen kennen. Io oder Self wären zum Beispiel solche Sprachen.
Zurück zu Python: Module haben die Klasse `module`. Das heisst aber nicht, dass es irgendwo Python-Code geben muss, der mit ``class module:`` beginnt, denn diese grundlegende Klasse ist in C implementiert und im Interpreter integriert.
Ausserdem ist die Klasse recht "langweilig", weil sie nichts weiter implementiert. Objekte von diesem Typ dienen ja nur als Namensraum und haben sonst keine weiteren Eigenschaften oder Aufgaben.
Ansonsten ist die einfachste, allgemeinste Beschreibung von einem Objekt wohl: ein "Ding" mit benannten Attributen. Wobei in der Regel einige Attribute Methoden sind, also an das Objekt gebundene Funktionen, die beim Aufruf automatisch das Objekt selbst als erstes Argument übergeben bekommen.
Zurück zu Python: Module haben die Klasse `module`. Das heisst aber nicht, dass es irgendwo Python-Code geben muss, der mit ``class module:`` beginnt, denn diese grundlegende Klasse ist in C implementiert und im Interpreter integriert.
Code: Alles auswählen
In [336]: codecs.__class__
Out[336]: <type 'module'>
In [337]: codecs.__class__.__module__
Out[337]: '__builtin__'
Ansonsten ist die einfachste, allgemeinste Beschreibung von einem Objekt wohl: ein "Ding" mit benannten Attributen. Wobei in der Regel einige Attribute Methoden sind, also an das Objekt gebundene Funktionen, die beim Aufruf automatisch das Objekt selbst als erstes Argument übergeben bekommen.
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
Hallo BlackJack,
Ist es denn wirklich falsch, wenn ich codecs in codecs.open() mit zum Beispiel cout oder cin als gleich betrachte?
dann heißt es ja, dass zum Beispiel codecs.open() eine Art built-in Funktion ist. Der Unterschied wäre nur dass wir das Modul codecs noch zu explizit zu importieren haben.BlackJack hat geschrieben:Objekte von diesem Typ dienen ja nur als Namensraum
Ist es denn wirklich falsch, wenn ich codecs in codecs.open() mit zum Beispiel cout oder cin als gleich betrachte?
@ratna_fong: Wieso ist `codecs.open()` eine Art builtin-Funktion? Als "built-in" bezeichnet man bei Python eigentlich die Objekte, die tatsächlich in den Interpreter eingebaut sind und in der Regel über das `__builtin__`-Modul erreichbar sind. `codecs` ist ein ganz normales Modul, das als Python-Quelltext bzw. Bytecode-Datei in der Standardbibliothek vorliegt und die `codecs.open()`-Funktion ist auch in Python geschrieben.
Abgesehen von `__builtin__` ist es IMHO ein Implementierungsdetail ob ein Modul eingebaut ist, oder als eigene Datei ausserhalb der Laufzeitumgebung existiert.
Was hast Du immer mit `cin` und `cout`? In wie fern sollte eine Funktion mit diesen beiden Objekten "gleich" sein? Welche Eigenschaften sollen da verglichen werden? Es sind alles Objekte. Aber dann sind `cin` und `cout` "das gleiche" wie *alle* Objekte in Python.
Abgesehen von `__builtin__` ist es IMHO ein Implementierungsdetail ob ein Modul eingebaut ist, oder als eigene Datei ausserhalb der Laufzeitumgebung existiert.
Was hast Du immer mit `cin` und `cout`? In wie fern sollte eine Funktion mit diesen beiden Objekten "gleich" sein? Welche Eigenschaften sollen da verglichen werden? Es sind alles Objekte. Aber dann sind `cin` und `cout` "das gleiche" wie *alle* Objekte in Python.
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
Danke für die Antwort BlackJack,
es ist mir grad klar geworden, was mich eigentlich stutzig macht:
codecs ist also ein ganz normales Modul. codecs ist also ein Modulbezeichner.
import codecs:
Es gibt also ein Modul mit dem Namen codecs.
Darauf hin meintest Du, codecs.open() ist eine Funktion in dem obengenannten Modul codecs.
Nun:
Modul heißt codecs
Funktion ist codecs.open()
Also, da fehlt was dazwischen. Ich weiss nicht wie ich das erklären soll, aber für mich fehlt da eine Art Übergang.
Normalerweise:
Modulname: fibonacci
Ich weiss nicht, ich finde es sehr irritierend, wenn ich eine Methode aufrufe, indem ich den Klassennamen nehme, statt ein Objekt der Klasse.
Also, statt test.berechne() fibonacci.berechne()
Es kann sein, dass ich grad Apfel und Birne vergleiche. Aber dafür ist der eine oder andere ja da, der vielleicht mir aufklären kann.
Gruss,
Eure Ratna

es ist mir grad klar geworden, was mich eigentlich stutzig macht:
codecs ist also ein ganz normales Modul. codecs ist also ein Modulbezeichner.
import codecs:
Es gibt also ein Modul mit dem Namen codecs.
Darauf hin meintest Du, codecs.open() ist eine Funktion in dem obengenannten Modul codecs.
Nun:
Modul heißt codecs
Funktion ist codecs.open()
Also, da fehlt was dazwischen. Ich weiss nicht wie ich das erklären soll, aber für mich fehlt da eine Art Übergang.
Normalerweise:
Modulname: fibonacci
Code: Alles auswählen
class fibonacci:
def berechne()
#Nun zum Aufruf der Funktion, schreibt man nach der Instantiierung dann:
test.berechne()
#statt
fibonacci.berechne()
Also, statt test.berechne() fibonacci.berechne()
Es kann sein, dass ich grad Apfel und Birne vergleiche. Aber dafür ist der eine oder andere ja da, der vielleicht mir aufklären kann.

Gruss,
Eure Ratna

- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Code: Alles auswählen
class fibonacci:
@staticmethod
def berechne():
pass
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@ratna_fong: Wo nimmst Du bei `codecs.open()` einen Klassennamen!? An den Namen `codecs` ist ein Objekt gebunden. Das Objekt ist *keine* Klasse. Die *Klasse* von dem Modul heisst `module`, das habe ich hier sogar schon einmal gezeigt.
Um das nochmal etwas akribischer auseinanderzunehmen: `codecs` ist ein Objekt vom Typ `module`. Mittels Punktoperator kann man von diesem Objekt das Attribut `open` abfragen. Das Objekt was man dabei bekommt ist aufrufbar und ein Exemplar der Klasse `function`. Beides sind Objekte die nicht durch (direktes) Aufrufen von Klassenobjekten erzeugt werden. Modulobjekte werden in der Regel durch ``import``-Anweisungen ggf. erzeugt und an Namen gebunden und Funktionsobjekte werden in der Regel durch ``def``-Anweisungen erzeugt.
Um das nochmal etwas akribischer auseinanderzunehmen: `codecs` ist ein Objekt vom Typ `module`. Mittels Punktoperator kann man von diesem Objekt das Attribut `open` abfragen. Das Objekt was man dabei bekommt ist aufrufbar und ein Exemplar der Klasse `function`. Beides sind Objekte die nicht durch (direktes) Aufrufen von Klassenobjekten erzeugt werden. Modulobjekte werden in der Regel durch ``import``-Anweisungen ggf. erzeugt und an Namen gebunden und Funktionsobjekte werden in der Regel durch ``def``-Anweisungen erzeugt.
Ich habe das Gefühl, dass du einfach zu sehr in dem OO-Paradigma von Java festhängst...
Noch nie C programmiert? Du gibt es auch einfache Funktionen, die man ohne deinen "Übergang" aufrufen kann.
Du musst dich einfach von dem "Alles ist ein Klasse"-Java-Prinzip lösen, dann ist das alles eigentlich ziemlich einleuchtend...
Noch nie C programmiert? Du gibt es auch einfache Funktionen, die man ohne deinen "Übergang" aufrufen kann.

Du musst dich einfach von dem "Alles ist ein Klasse"-Java-Prinzip lösen, dann ist das alles eigentlich ziemlich einleuchtend...
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher
http://ms4py.org/
Gerhard Kocher
http://ms4py.org/
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
hat mein Problem eigentlich mit Duck-Typing zu tun? Bin aus Verzweiflung auf den Begriff gestoßen, hab dann versucht, die Definition von Duck-Typing in den Fall "codecs" reinzuziehen.
Ich habe den Eindruck:
1. Objekt einfach mal erstmal erstellen
2. Geprüft, geguckt, ob das erstellte Objekt die erwünschte Funktion aufrufen kann, bzw. ob das Objekt bestimmte Attribute für die Funktion besitzt.
3. Wenn ja, geht durch
4. Falls nein, es kracht an der Stelle, wo eine Funktion zum beispiel aufgerufen wird, die es nicht gibt.
Nun das ganze auf "meinen" Fall, codecs, zu übertragen.
codecs ist also ein Objekt, das Objekt hat ja Attribute. Nun zu codecs.open().
open() sagt, "lieber codecs, du hast all die Attribute, die nötig sind, um mich aufzurufen. Kannst mich jetzt kurz haben."
Kurze Zeit später ruft open(): "Nächste bitte !!!"
Also, ich werde auch noch bekloppt.
Eure Ratna
Ich habe den Eindruck:
1. Objekt einfach mal erstmal erstellen
2. Geprüft, geguckt, ob das erstellte Objekt die erwünschte Funktion aufrufen kann, bzw. ob das Objekt bestimmte Attribute für die Funktion besitzt.
3. Wenn ja, geht durch
4. Falls nein, es kracht an der Stelle, wo eine Funktion zum beispiel aufgerufen wird, die es nicht gibt.
Nun das ganze auf "meinen" Fall, codecs, zu übertragen.
codecs ist also ein Objekt, das Objekt hat ja Attribute. Nun zu codecs.open().
open() sagt, "lieber codecs, du hast all die Attribute, die nötig sind, um mich aufzurufen. Kannst mich jetzt kurz haben."
Kurze Zeit später ruft open(): "Nächste bitte !!!"
Also, ich werde auch noch bekloppt.
Eure Ratna
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Jein, nur in soweit, wie ich das schon beschrieben hatte, es also nicht nach Typen unterschieden wird, sondern nach Verhalten.ratna_fong hat geschrieben:hat mein Problem eigentlich mit Duck-Typing zu tun?
1. Ist falsch, es wird kein Objekt bei dem Aufruf erstellt, sondern es muss existieren.
2. Auch, es wird nicht zuerst ueberprueft, sonder erstmal gemacht "Easier to Ask Forgiveness than to get Permission" (EAFP)
`codecs.open()` == `codecs.open.__call__()`
1. Es gibt einen lookup auf codecs: Gibt es das nicht, wird ein NameError geworfen.
2. Lookup auf open innerhalb von codecs: Gibt es das nicht, wird ein NameError geworfen.
3. Aufruf von __call__: NameError ... ha falsch geraten! Die Laufzeitumgebung erkennt das und gibt die hilfreichere Meldung, dass open kein `callable` ist (als TypeError).
Wenn dich die Interna wirklich interessieren, willst du vllt die Language Reference anschaun: http://docs.python.org/reference/
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
codecs.open()
diese Methode funktioniert, da das Objekt codecs existiert und es wird in der Doku definiert, dass es existiert und funktioniert.
codecs war schon vorher erzeugt worden, nämlich mit der Klasse module. Nun, da codecs das Verhalten besitzt, um von open() aufgerufen werden zu können, funktioniert das alles.
Richtig?
Dann hab ich aber ne Frage, wo "steht" open()? Ist das eine Funktion, auf die jedes Objekt versuchen kann, zuzugreifen?
Danke Leutz.
Eure Ratna
diese Methode funktioniert, da das Objekt codecs existiert und es wird in der Doku definiert, dass es existiert und funktioniert.
codecs war schon vorher erzeugt worden, nämlich mit der Klasse module. Nun, da codecs das Verhalten besitzt, um von open() aufgerufen werden zu können, funktioniert das alles.
Richtig?
Dann hab ich aber ne Frage, wo "steht" open()? Ist das eine Funktion, auf die jedes Objekt versuchen kann, zuzugreifen?
Danke Leutz.
Eure Ratna
@ratna_fong: Die Dokumentation definiert keine Objekte sondern beschreibt sie nur. Wenn es die Doku nicht gäbe, wäre ja trotzdem das Modul vorhanden.
Das Objekt `codecs` wird beim erstmaligen importieren aus der entsprechenden Python-Quelltext oder -Bytecodedatei erzeugt.
Was meinst Du mit "steht"? Es wird in der Quelltextdatei vom `codecs`-Modul definiert. Und natürlich kann jedes Objekt auf die `open()`-Funktion zugreifen, wenn das Funktionsobjekt irgendwie erreichbar ist, also zum Beispiel über das `codecs`-Modulobjekt oder direkt, wenn die Funktion im lokalen Modul an einen Namen gebunden wurde.
Das Objekt `codecs` wird beim erstmaligen importieren aus der entsprechenden Python-Quelltext oder -Bytecodedatei erzeugt.
Der Satz macht keinen Sinn. Das Modul wird doch nicht von `open()` aufgerufen!? `codecs` besitzt halt ein Attribut mit dem Namen `open` und das Objekt ist aufrufbar und besitzt die Semantik die in der Dokumentation beschrieben ist. Und Modul-Objekte besitzen eigentlich kein Verhalten was über Attributzugriffe mittels Punktoperator hinausgeht, also die Grundlagen für *jedes* Objekt.Nun, da codecs das Verhalten besitzt, um von open() aufgerufen werden zu können, funktioniert das alles.
Was meinst Du mit "steht"? Es wird in der Quelltextdatei vom `codecs`-Modul definiert. Und natürlich kann jedes Objekt auf die `open()`-Funktion zugreifen, wenn das Funktionsobjekt irgendwie erreichbar ist, also zum Beispiel über das `codecs`-Modulobjekt oder direkt, wenn die Funktion im lokalen Modul an einen Namen gebunden wurde.
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
vielen Dank BlackJack,
das Objekt codecs wird also beim Importieren erzeugt, ersellt bzw. instantiiert. Du meintest, nämlich aus dem entsprechenden Quellcode oder Bytecode.
Ist dieser Quellcode eigentlich das Modul codecs?
In dem Modul codecs steht aber jedenfalls die Funktion/Attribut open().
Das hört sich jetzt wieder nach einer ganz "normalen" Objektorientierung wie bie Java oder C++
Ich glaube, mein Hauptproblem ist der Begriff "Modul". Das Modul heißt codecs. Was steht denn in diesem Modul, Definitionen von Klassen, Funktionen, usw.. oder?
Ich kann mich natürlich arrangieren, indem ich mir einfach vorstelle, "ein Objekt namens codecs wird instantiiert, sobald ich der Interpreter import codecs einliest. Und dieses Objekt kann auf die Funktion open() zugreifen."
Ob dies aber stimmt, das bezweifle ich.
Gruss,
Ratna
das Objekt codecs wird also beim Importieren erzeugt, ersellt bzw. instantiiert. Du meintest, nämlich aus dem entsprechenden Quellcode oder Bytecode.
Ist dieser Quellcode eigentlich das Modul codecs?
In dem Modul codecs steht aber jedenfalls die Funktion/Attribut open().
Das hört sich jetzt wieder nach einer ganz "normalen" Objektorientierung wie bie Java oder C++
Ich glaube, mein Hauptproblem ist der Begriff "Modul". Das Modul heißt codecs. Was steht denn in diesem Modul, Definitionen von Klassen, Funktionen, usw.. oder?
Ich kann mich natürlich arrangieren, indem ich mir einfach vorstelle, "ein Objekt namens codecs wird instantiiert, sobald ich der Interpreter import codecs einliest. Und dieses Objekt kann auf die Funktion open() zugreifen."
Ob dies aber stimmt, das bezweifle ich.
Gruss,
Ratna
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
ich frage mal ganz vorsichtig:
ist also codecs doch nicht so eine Art cout oder cin?
cout oder cin ist ja jeweils ein Objekt, das Attribute besitzt.
cout.ausgabeoperator(string)
ist das nicht so ähnlich wie:
codecs.encodes(parameter)
ist also codecs doch nicht so eine Art cout oder cin?
cout oder cin ist ja jeweils ein Objekt, das Attribute besitzt.
cout.ausgabeoperator(string)
ist das nicht so ähnlich wie:
codecs.encodes(parameter)
@ratna_fong: Du vermischt immer verschiedene Ebenen. In dem Modul-Objekt `codecs` steht nichts. Das ist ein Objekt mit Attributen. In der Quelltextdatei `codecs.py` steht Python-Quelltext, der bei der Ausführung die Attribute des `codecs`-Objektes definiert.
Das Objekt wird nicht erstellt wenn die ``import``-Anweisung eingelesen wird, sondern wenn sie ausgeführt wird. Und dann hat das Objekt ein Attribut mit dem Namen `open` das an ein Funktionsobjekt gebunden ist.
Das kannst Du doch aber auch alles selber ausprobieren! In einer Python-Shell zum Beispiel. Und das es in der Standardbibliothek eine Datei `codecs.py` gibt und was da drin steht hättest Du auch selber viel schneller herausfinden können als durch das nachfragen hier.
Und das mit dem `cin`/`cout` verstehe ich nicht. Warum fragst Du das immer wieder? Bei den Kriterien die Du da anlegst ist *alles* in Python so etwas wie `cin` oder `cout` weil eben alles was man an einen Namen binden kann ein Objekt ist.
Das Objekt wird nicht erstellt wenn die ``import``-Anweisung eingelesen wird, sondern wenn sie ausgeführt wird. Und dann hat das Objekt ein Attribut mit dem Namen `open` das an ein Funktionsobjekt gebunden ist.
Das kannst Du doch aber auch alles selber ausprobieren! In einer Python-Shell zum Beispiel. Und das es in der Standardbibliothek eine Datei `codecs.py` gibt und was da drin steht hättest Du auch selber viel schneller herausfinden können als durch das nachfragen hier.
Und das mit dem `cin`/`cout` verstehe ich nicht. Warum fragst Du das immer wieder? Bei den Kriterien die Du da anlegst ist *alles* in Python so etwas wie `cin` oder `cout` weil eben alles was man an einen Namen binden kann ein Objekt ist.
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
codecs.open("sample.txt")
heißt die Zeile hier oben:
öffne die Datei sample.txt mittels der Funktion open, DIE in dem Modul codecs definiert ist
Angenommen:
So gesehen, sind codecs und ratna eine Art Schnittstelle und Bezeichner für das entsprechende Modul.
So richtig?
codecs.open("sample.txt")
Hierbei ist codecs das Objekt. Was ist hier der Name, an den das Objekt codecs gebunden wird?
heißt die Zeile hier oben:
öffne die Datei sample.txt mittels der Funktion open, DIE in dem Modul codecs definiert ist
Angenommen:
Code: Alles auswählen
import codecs
import ratna
#in der Datei ratna.py gibt es die Funktion open()
codecs.open("sample.txt")
ratna.open("sample.txt")
So richtig?
Hierzu mal zur Sicherheit eine Verständnisfrage:BlackJack hat geschrieben: weil eben alles was man an einen Namen binden kann ein Objekt ist.
Code: Alles auswählen
i = 5
# 5 ist das Objekt
# i ist der Name
# das Objekt 5 wir an den Namen i gebunden
Hierbei ist codecs das Objekt. Was ist hier der Name, an den das Objekt codecs gebunden wird?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
codecs ist der Name an den das Modul-Objekt gebunden wird.ratna_fong hat geschrieben:Hierbei ist codecs das Objekt. Was ist hier der Name, an den das Objekt codecs gebunden wird?
Code: Alles auswählen
import codecs
a = codecs
b = codecs
c = codecs
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 38
- Registriert: Samstag 3. Juli 2010, 10:43
codecs.open("sample.txt")
die Funktion open() ist also das Modul-Objekt, das an den Namen codecs gebunden wird?Leonidas hat geschrieben: codecs ist der Name an den das Modul-Objekt gebunden wird.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Der Name ist codecs, das Objekt, das an den Namen gebunden ist, ist das codecs-Modul. Das codecs-Modul muss nicht immer an den Namen codecs gebunden sein:ratna_fong hat geschrieben:codecs.open("sample.txt")
Hierbei ist codecs das Objekt. Was ist hier der Name, an den das Objekt codecs gebunden wird?
Code: Alles auswählen
>>> import codecs as foo
>>> foo.open
<function open at 0x7fe3fbf83a28>
>>> bar = foo
>>> bar
<module 'codecs' from '/usr/lib/python2.6/codecs.pyc'>
>>> bar.open
<function open at 0x7fe3fbf83a28>
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Nein. Das codecs-Modul ist das Modul-Objekt, das an den Namen codecs gebunden wird.ratna_fong hat geschrieben:die Funktion open() ist also das Modul-Objekt, das an den Namen codecs gebunden wird?
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei