Ein paar Fragen über das überladen von operatoren...

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
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

sape hat geschrieben:
birkenfeld hat geschrieben:
Falls zwei Objekte die gleiche id haben, muss das eine, eine Referenz auf das andere sein oder auf ein Objekt X das noch nicht untersucht wurde.
Kein Objekt ist eine Referenz auf ein anderes (außer es ist ein weakref-Objekt ;)), ein Objekt ist ein Objekt. Und was ist an einem Objekt, das noch nicht untersucht wurde, anders als an einem, das untersucht wurde? Wir sind hier nicht in der Quanteninformatik.
Ok, ich dachte Namen werden auch als Objekt betrachtet, das es doch heißt dass alles in Python ein Objekt ist? Ist denn die Variabel x (Instanz von x= [1,2,3]) kein Objekt? Sind Namen keine Objekte?
Nein, Namen sind keine Objekte, sondern Einträge in Namensräumen, die auf Objekte verweisen. (Der Namensraum ist natürlich ein Objekt (normalerweise ein Dictionary), und der String, der den Key im Namensraum bildet, auch.
birkenfeld hat geschrieben:
Tja, was sagte ich noch am Anfang? ``id`` gibt die Identität zurück? Das habe ich ja wohl ad absurdum geführt :lol: Eine Identität ist was einzigartiges, einmaliges. Das gilt für Objekte/Name in Python aber anscheinend nicht. Mal ernsthaft: Alles in Python ist nur eine Referenz.
Das ist, mit Verlaub gesagt, Schwachsinn. Du solltest mal [wiki]Objekte[/wiki] durchlesen.
Ja aber wenn ich folgendes habe:

Code: Alles auswählen

x = [1,2 ,3]
y = x
Dan ist doch y eine Referenz von x? Oder nicht? Und x ist doch auch ein Objekt, es sei den Namen sind keine Objekte ;)
x und y sind Namen und zeigen beide auf das Listenobjekt. y zeigt nicht auf den Namen x.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

sape hat geschrieben:
Alles ist ein Objekt, und Variablen sind Referenzen auf Objekte.
Ok, dann sind Namen (Variablen?) nur Referenzen auf Objekte (Klassen und ?) und selbst keine Objekte? 0_o Ich dachte immer das eine Instanz von einer Klasse auch ein Objekt darstellt und nicht eine Referenz auf die Klasse.
Eine Instanz ist ein Objekt. Der Name nicht. Deswegen gibt es ja z.b. id().
[wiki]Objekte[/wiki]
Wiki-Objekte hat geschrieben:Objekte haben außerdem:

* keine oder mehrere Methoden (vom Typobjekt bereitgestellt)
* keinen oder mehrere Namen
Was ist den eine Funktion in Python? Auch ein Objekt des Namensraumes "Modul"? Oder sind in gruden nur Klassen (Namensräume) nur Objekte und somit auch Module? Operatoren sind in Python schonmal keine Objekte, so wie in Ruby?
Funktionen sind Objekte. Funktionen in Modulen haben (zumindest) einen Namen, der im Namensraum des Moduls eingetragen ist, Methoden im Namensraum der Klasse.

Wo und wie sind in Ruby Operatoren Objekte?
Sorry aber um so mehr ich über die Definition "Objekte bei Python" nachdenke um so inkonsistenter erscheint mir das.

Ich dachte **alles** ist ein Objekt in Python.
Ja, ist es auch. Du hast es nur nicht verstanden.

Oder meinst du, auch "if" und "import" sollen Objekte sein?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sape hat geschrieben:

Code: Alles auswählen

def edit(list_):
    list_.append("Keine Referenz?")

li = [1,2,3]
print li
edit(li)
print li

Code: Alles auswählen

[1, 2, 3]
[1, 2, 3, 'Keine Referenz?']
Das wundert dich jetzt nicht, oder?
Du hast eine Funktion edit(), die einen Namen nimmt, das daran gebundene Objekt an list_ bindet und dort dessen Funktion append() aufruft.
Gehen wir es mal durch: Du erstellst eine Liste, fein. Dann zeigst du die Liste an, danach wird das an li gebundene Objekt geändert (wobei es zwischenzeitlich einen zweiten Namen, list_, bekommt, der aber beim Beenden der Funktion zerstört wird). Dann Zeigst du das an, und siehst, dass das Objekt sich verändert hat. Wo ist da der Wiederspruch?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ok, danke euch beiden. Das hilft mir dann schon mal weiter zum Verständnis.

Eine Frage ist aber noch offen:

Vorweg:
In C: ``int i = 0``
In C wäre i eine Variable vom Datentype int.

In C++ sind Instanzen von Klassen auch Variablen, werden aber halt Instanzen genant.

Daher die Frage: Sind den Namen in Python Variablen und instanzen?
Wiel für mich ist i in folgenden Code eine Instanz/Variabel (Wie auch immer. immer diese Unterscheidung zwischen Variabel und instanz) von Foo:

Code: Alles auswählen

class Foo(): pass
i = Foo()
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

birkenfeld hat geschrieben: Eine Instanz ist ein Objekt. Der Name nicht. Deswegen gibt es ja z.b. id().
Puh, nun wird es ansträngend:

Code: Alles auswählen

class Foo: pass
x = Foo()
Was ist x? Ist x die Instanz von Foo? Wenn ja dann ist x ein Objekt! x ist aber auch der Name der Instanz von Foo == x ist die Instanz von Foo.
birkenfeld hat geschrieben: Funktionen sind Objekte. Funktionen in Modulen haben (zumindest) einen Namen, der im Namensraum des Moduls eingetragen ist, Methoden im Namensraum der Klasse.
Funktionen sind also Objekte? Eine Funktion hat doch aber ein Namen. Eine Klasse hat auch ein Namen. Bei einer Klasse wird aber gesagt sie ist ein Objekt. Ok. Bei einer Funktion wird dann auch gesagt sie ist ein Objekt. Aber ein Instanz ist kein Objekt? Ne Moment, Du sagtest ja das Instanzen auch Objekte sind. Dan ist der Name x auch ein Objekt das an das Objekt Foo gebunden ist, weil x die Instanz von Foo ist?

Merkt keiner den Widerspruch, bzw. wie kleinkariert das eigentlich ist?
Ich möchte auch erklären warumd as kleinkariert ist.
Du sagst das Instanzen Objekte sind. Du sagt aber das Namen kein Objekte sind. Man kann aber nur über einen Namen eine Instanz erzeugen. So abld ich ``x = Foo()`` schreibe ist x eine Instanz und somit ein Objekt. Aber sobald ich sage das x der Name ist der an Foo gebunden ist, ist es kein Objekt mehr sondern nur ein Namen?
Wo und wie sind in Ruby Operatoren Objekte?
Per Definition ist alles in Ruby ein Objekt. Man kann wirklcih alles überladen.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas hat geschrieben: Das wundert dich jetzt nicht, oder?
Nein. Bitte den Kontext beachten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

In denem Code ist ``i`` ein Name, der auf eine Instanz von ``Foo`` zeigt.

Ist ja auch logisch, nimm mal den Code:

Code: Alles auswählen

i = Foo()
noch_ein_i = i
Dann ist ``noch_ein_i`` natürlich keine weitere Instanz, sondern zeigt auf die gleiche Instanz wie ``i`` (kannst ja mal mit id() nachschauen).

Irgendwie ist der Name Variable in Python eigentlich nicht zutreffend, da er zu ungenau ist, bezeichnet nun die Variable ``i`` den Namen ``i`` oder das an ``i`` gebundene Objekt? Aber in der Regel ist diese Ungenauigkeit kein sonderliches Problem.

Die Unterscheidung ist also nicht zwischen Instanz und Variabel, sondern zwischen Objekt und Name.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas hat geschrieben:In denem Code ist ``i`` ein Name, der auf eine Instanz von ``Foo`` zeigt.
[...]
Ah nun habe ichs. Der Name zeigt auf die Instanz vom Objekt (Der Klasse) ``Foo``.
Leonidas hat geschrieben: Irgendwie ist der Name Variable in Python eigentlich nicht zutreffend, da er zu ungenau ist, bezeichnet nun die Variable ``i`` den Namen ``i`` oder das an ``i`` gebundene Objekt? Aber in der Regel ist diese Ungenauigkeit kein sonderliches Problem.
Genau, daran hat es auch gelegen. Aber schön das du verstanden hast worauf ich hinaus wollte und warum ich das nicht verstanden hatte :)

EDIT: Hinzugefügt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sape hat geschrieben:

Code: Alles auswählen

class Foo: pass
x = Foo()
Was ist x? Ist x die Instanz von Foo? Wenn ja dann ist x ein Objekt! x ist aber auch der Name der Instanz von Foo == x ist die Instanz von Foo.
Nein, das an den Namen ``x`` gebundene Objekt ist eine Instanz von Foo. Der Name ``x`` ist kein Objekt, es gibt ebensowenig auch ungebundene Namen. Aber ungebundene Objekte (die dann vom GC entsorgt werden).
sape hat geschrieben:Funktionen sind also Objekte? Eine Funktion hat doch aber ein Namen.
Nein, die Funktion hat keinen Namen. Sie ist nur an einen Namen gebunden.

Code: Alles auswählen

In [13]: tex, mex, klex = hex, hex, hex
Und nun ist das Funktionobject welches an den Namen ``hex`` gebunden ist, auch an andere Namen gebunden. Mit lambda kannst du auch anonyme Funktionen bilden, die zwar ein Objekt sind, aber an keinen Namen gebunden sind.
sape hat geschrieben:Eine Klasse hat auch ein Namen.
Hat keinen Namen, sondern ist an einen Namen gebunden.
sape hat geschrieben:Bei einer Klasse wird aber gesagt sie ist ein Objekt. Ok. Bei einer Funktion wird dann auch gesagt sie ist ein Objekt. Aber ein Instanz ist kein Objekt?
Doch, sicher.

Code: Alles auswählen

class Foo(object): pass
Foo()
# so, jetzt hatten wir eine Instanz (ein Objekt), die aber keinen Namen hatte
# ist daher nicht greifbar und an dieser stelle möglicherweise 
# schon vom GC abgeräumt
sape hat geschrieben:Ne Moment, Du sagtest ja das Instanzen auch Objekte sind. Dan ist der Name x auch ein Objekt das an das Objekt Foo gebunden ist, weil x die Instanz von Foo ist?
Andersrum, das Objekt ist an den Namen gebunden.
sape hat geschrieben:Merkt keiner den Widerspruch, bzw. wie kleinkariert das eigentlich ist?
Es gibt keinen Widerspruch. Du mischt aber den Namen mit dem Wert, daher ergibt sich ein Widerspruch.
sape hat geschrieben:Du sagst das Instanzen Objekte sind. Du sagt aber das Namen kein Objekte sind. Man kann aber nur über einen Namen eine Instanz erzeugen. So abld ich ``x = Foo()`` schreibe ist x eine Instanz und somit ein Objekt. Aber sobald ich sage das x der Name ist der an Foo gebunden ist, ist es kein Objekt mehr sondern nur ein Namen?
Die ersten zwei Sätze stimmen ja. Aber ``x`` ist keine Instanz, sindern nur eine Art Zeiger auf das wirkliche Objekt, welches eine Instanz der Klasse ``Foo`` ist.
sape hat geschrieben:
Wo und wie sind in Ruby Operatoren Objekte?
Per Definition ist alles in Ruby ein Objekt. Man kann wirklcih alles überladen.
Nein. Keywords wie if, class, end sind keine Objekte und können nicht überladen werden. Daher bitte ich dich, jede weitere Behauptung über das in Ruby mögliche Überladen von allem erstmal mit Code zu belegen. Die Leute aus #ruby-de wären auch daran interessiert, haben so etwas auch noch nie gesehen und fänden so etwas sicher lehrreich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas hat geschrieben:Schau dir mal http://bj.spline.de/download/names'n'objects.pdf an.
Thx! Nun habe ich es endgültig verstanden. (BTW: Scheiß C++. Dort gibt es keine solche Unterscheidung und ist in meinen alten Buch auch nicht so aufgeführt!).

Aber noch eine Frage (Die letzte).

Sehe ich das richtig das diese Einführung mit der unterscheidung von *Name und Objekt* bei Python nur deswegen da ist, weil wir es in Python hauptsächlich mit Referenzen zu tun haben (Mehrere Namen können auf die gleiche Instanz zeigen)?

In C gibt es das ja so nicht. In C ist der Name X nicht nur ein Name sondern auch die Variable (Oder Instanz in C++).

Sorry, falls ihr denkt ich will euch ärgern. Das ist nicht meine Absicht. Wenn ich was wissen will, dann richtig. Deshalb die Fragen. :)

BTW: Falls gleich kommt: "I C/C++ gibt es auch Referenzen". Ja, weiß ich. Die werden dort mit pointern (*, **) gemacht, mit denen man auf Verschiedene Variablen Zeigen kann oder auch Dynamisch Speicher allokieren kann! Aber wenn ich folgendes habe:
int x = 1
int y = 2

und dan x = y schreibe, Zeigt x nicht auf y so wie bei Python ;) Um das zu erreichen muss x ein pointer sein.
int y = 1
int *x = y.

Daher auch die frage oben weshalb es in Python dazu kam wie es ist.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

sape hat geschrieben:
birkenfeld hat geschrieben: Eine Instanz ist ein Objekt. Der Name nicht. Deswegen gibt es ja z.b. id().
Puh, nun wird es ansträngend:

Code: Alles auswählen

class Foo: pass
x = Foo()
Was ist x? Ist x die Instanz von Foo? Wenn ja dann ist x ein Objekt! x ist aber auch der Name der Instanz von Foo == x ist die Instanz von Foo.
Du vermengst immer das Objekt (das für sich keinen Namen als Eigenschaft hat oder braucht) und den/die Namen, an die es gebunden ist.

Wenn du nun "x" sagst, meinst du das Objekt und sagst Namen, daher kommt dein Problem.
Funktionen sind also Objekte? Eine Funktion hat doch aber ein Namen.
Das schließt sich nicht aus.
Ne Moment, Du sagtest ja das Instanzen auch Objekte sind. Dan ist der Name x auch ein Objekt das an das Objekt Foo gebunden ist, weil x die Instanz von Foo ist?
Hier ist es eben wichtig, zwischen Namen und Objekt zu trennen. Die Instanz von Foo ist ein Objekt. Sie kann z.B. an den Namen x, aber auch an den Namen y oder THE_ANSWER_TO_LIFE_UNIVERSE_AND_EVERYTHING gebunden werden, oder zum Beispiel auch an eine Liste angefügt werden.
Der Name "x" ist eben kein Objekt und auch nicht mit der Instanz identisch. Die Instanz kann weiter existieren, wenn der Name schon längst nicht mehr gültig ist.
Merkt keiner den Widerspruch, bzw. wie kleinkariert das eigentlich ist?
Ich möchte auch erklären warumd as kleinkariert ist.
Du sagst das Instanzen Objekte sind. Du sagt aber das Namen kein Objekte sind. Man kann aber nur über einen Namen eine Instanz erzeugen. So abld ich ``x = Foo()`` schreibe ist x eine Instanz und somit ein Objekt. Aber sobald ich sage das x der Name ist der an Foo gebunden ist, ist es kein Objekt mehr sondern nur ein Namen?
Das sollte sich ja inzwischen aufgeklärt haben.
Wo und wie sind in Ruby Operatoren Objekte?
Per Definition ist alles in Ruby ein Objekt. Man kann wirklcih alles überladen.
Entschuldige, wir sind hier nicht in der Mathematik. Man kann nichts definieren. "Per definitionem" ist also weder in Ruby noch in Python alles ein Objekt.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Leonidas, danke für den Post vom "Verfasst am: So Feb 04, 2007 14:12 ". :)

Birkefeld auch dir eine großes Dankeschön für deine Posts und das du das Thema angesprochen hast.

lg
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

sape hat geschrieben: In C gibt es das ja so nicht. In C ist der Name X nicht nur ein Name sondern auch die Variable (Oder Instanz in C++).
Ja. Eine Variable zeigt auf einen Speicherbereich. Mehr siehe unten.
Sorry, falls ihr denkt ich will euch ärgern. Das ist nicht meine Absicht. Wenn ich was wissen will, dann richtig. Deshalb die Fragen. :)
Ist schon richtig so, wenn man es verstanden hat, dann auch richtig.
BTW: Falls gleich kommt: "I C/C++ gibt es auch Referenzen". Ja, weiß ich. Die werden dort mit pointern (*, **) gemacht,
Nicht ganz, es gibt auch "echte" Referenzen (mit &).
mit denen man auf Verschiedene Variablen Zeigen kann oder auch Dynamisch Speicher allokieren kann! Aber wenn ich folgendes habe:
int x = 1
int y = 2

und dan x = y schreibe, Zeigt x nicht auf y so wie bei Python ;)
Genau.
Um das zu erreichen muss x ein pointer sein.
int y = 1
int *x = y.
Genau. Deswegen kann man das Verhalten von Python auch sehr gut mit dem von Pointern in C vergleichen. (Kein Wunder, im Core wird ja auch auf alle Objekte mittels Pointern verwiesen.) Es entspricht dann Speicherbereich <-> Objekt und Pointer <-> Name.
Daher auch die frage oben weshalb es in Python dazu kam wie es ist.
Die andere Frage wäre, wie willst du es sonst machen? Der Ist-Zustand ist einfach der logischste und einfachste Weg, objektorientiert zu programmieren, wobei eben wirklich "alles" ein Objekt ist.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Ich weiss nicht ob ich's schlimmer oder besser mache, aber ich wollte nochmal was zur Begriffsklärung "Variable" sagen. Name und Variable sind nicht das gleiche. Der Name ist einfach nur ein Bezeichner, das ist in Python und C gleich. Beispiel(e):

Code: Alles auswählen

x = 42

Code: Alles auswählen

int x = 42;
Hier haben wir in beiden Fällen den Namen `x`. Eine Variable ist aber mehr als der Name, nämlich ein Verbund aus dem Namen, dem Wert, dem Typ und der Speicheradresse.

Python und C unterscheiden sich hier in der Zuordnung von Typ und Speicheradresse. Während bei C einem Namen die (relative) feste Speicheradresse und der Typ zugeordnet wird, sind diese Eigenschaften bei Python fest mit dem Wert verbunden.

Daraus folgt eine sehr unterschiedliche Semantik der Zuweisung. Solange man sich nur mit einer Semantik beschäftigt, kann man die Begriffe Name, Variable oder "x ist 42" nahezu problemlos durcheinanderwürfeln, aber wenn man beide Semantiken vergleicht, dann muss man auf mehr Präzision achten.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

sape hat geschrieben:Per Definition ist alles in Ruby ein Objekt. Man kann wirklcih alles überladen.
Das ist falsch. In Python kann ich mehr Überladen als in Ruby. Zum Beispiel den Wahrheitswert eines Objektes, den Funktionsoperator '()'. </offtopic>
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Und noch ein absurdes Beispiel zu der Name, Objekt Sache:

Code: Alles auswählen

a = 42
ist eigentlich das gleiche wie

Code: Alles auswählen

locals()['a'] = 42
und locals ist so definiert:

Code: Alles auswählen

def locals():
    return sys._getframe(1).f_locals
Wie du siehst ist hier wirklich alles ein Objekt. Noch objektiger als in Ruby wo ich weder ein Traceback noch ein Frame Objekt habe. Besonders ersteres schleimt dort ungemein.
TUFKAB – the user formerly known as blackbird
BlackJack

Io ist aber noch objektiger als Python. Python hat noch Schlüsselworte die keine Objekte sind. :-)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

BlackJack hat geschrieben:Io ist aber noch objektiger als Python. Python hat noch Schlüsselworte die keine Objekte sind. :-)
Tja. Man kanns übertreiben. Und schöne Syntax *und* Programmable Syntax schließen sich aus :D
TUFKAB – the user formerly known as blackbird
BlackJack

Sag das mal den Lispern. ;-)

Ich finde die Syntax von Io aber nicht schlecht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Sag das mal den Lispern. ;-)
Ich habe es versucht - ehrlich, weil ich an sich gegen Klammern nichts habe. Aber entweder muss man sich an das wirklich gewöhnen oder es ist schlicht und einfach grausam. Das schlimme sind nicht die Klammern sondern die schließenen Klammern. Wenn Code wieder mal mit ``))))))))`` endet dann blickt man leider nicht wirklich gut durch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten