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: 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
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Leonidas hat geschrieben:Wenn Code wieder mal mit ``))))))))`` endet dann blickt man leider nicht wirklich gut durch.
Hehe... das Problem kenn ich zu gut ^^ Genial hin oder her... das ist nur toll, wenn man gerade voll im "Klammerfluss" haengt :lol:

Ehm... was ist denn Io?
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

nkoehring hat geschrieben:[...]
Ehm... was ist denn Io?
http://de.wikipedia.org/wiki/Io_%28Prog ... sprache%29
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Vielen Dank :) Es ist immer wieder interessant, was es alles fuer Programmiersprachen gibt. Das mit dem Prototypenzeugs wollte ich mir eh mehr zu gemuete fuehren, einfach um damit umgehen und es richtig verstehen zu koennen... :roll:
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
BlackJack

Bei Lisp und Scheme muss man einen Editor benutzen, der einen bei den Klammern unterstützt.

Minimalanforderung: Highlighting der entsprechenden "Gegenklammer", wenn man mit dem Cursor an einer Klammer steht und verschiedene Farben für verschiedene Klammerebenen. Dann sieht man sehr schnell wo etwas nicht passt.

Oder man nimmt Emacs und lässt den Editor die Klammern automatisch setzen, dann kann man sie als Programmierer fast komplett vergessen.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

VIM nimmt einem sowas auch ab.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Bei Lisp und Scheme muss man einen Editor benutzen, der einen bei den Klammern unterstützt.

Minimalanforderung: Highlighting der entsprechenden "Gegenklammer", wenn man mit dem Cursor an einer Klammer steht und verschiedene Farben für verschiedene Klammerebenen. Dann sieht man sehr schnell wo etwas nicht passt.
Klar, so einen Editor habe ich, vim. Aber wirklich komfortabel ist es nicht wirklich. Und für die interaktive Lisp/Scheme-Konsole fällt sowas leider weg. Davon mal abgesehen finde ich den vim-Support für Lisp etwas arm, automatisches Klammersetzen wäre sicherlich nicht übel.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten