Seite 1 von 2
OOP Problem
Verfasst: Dienstag 2. März 2010, 18:42
von SElsner
Hallo,
ich dachte eigentlich, dass Argumente in Python, die keine elementaren Datentypen sind per reference uebergeben werden. Da hab ich mich aber wohl geirrt. Etwa wenn das argument schon ein klassenmember ist. wie etwa hier in der MainWindow Klasse:
Code: Alles auswählen
class Shot (object):
def __init__(self,name):
self.name=name
class MainWindow (object):
def __init__(self):
self.shots=[]
self.model=TableModel(self.shots)
def fillShots(self):
self.shots=[Shot("11"),Shot("22"),Shot("33"),Shot("44"),Shot("55"),Shot("66")]
class TableModel (object):
def __init__(self,shots):
self.shots=shots
window=MainWindow()
print window.model.shots
window.fillShots()
print window.shots
print window.model.shots
Eigentlich ist mein Wunsch, dass der letzte aufruf das gleiche ausgiebt wie der vorletzte, da ich dachte, dass wenn ich fillShots aufrufe die aenderungen (durch die Referenz) auch bei der TableModel Instanz ankommen...
Geht das irgendwie?
Gruss
Sebastian
Verfasst: Dienstag 2. März 2010, 18:47
von jbs
elementaren Datentypen
Die gibt es in Python nicht.
Du bindest neue Shots an den Namen self.shots. Ein .append oder .extend soltlen da eher das mittel der Wahl sein.
Verfasst: Dienstag 2. März 2010, 18:47
von Panke
Vergiss mal Call by Value und Call by Reference in Python. Jedesmal wenn du ein = siehst, heißt das: Das Objekt das rechts steht, wird an den Namen links gebunden. Was vorher an den Namen gebunden war, ist völlig unerheblich.
Verfasst: Dienstag 2. März 2010, 18:52
von jbs
Panke hat geschrieben:Vergiss mal Call by Value und Call by Reference in Python. Jedesmal wenn du ein = siehst, heißt das: Das Objekt das rechts steht, wird an den Namen links gebunden. Was vorher an den Namen gebunden war, ist völlig unerheblich.
Code: Alles auswählen
l1 = []
l2 = l1
l1.append(0)
print l1==l2
print l1 is l2
l2 = [0]
print l1==l2
print l1 is l2
Re: OOP Problem
Verfasst: Dienstag 2. März 2010, 19:35
von Darii
SElsner hat geschrieben:ich dachte eigentlich, dass Argumente in Python, die keine elementaren Datentypen sind per reference uebergeben werden.
Es gibt keine elementaren Datentypen in Python nur Objekte. Als Übergabetyp kennt Python nur „per Value“ wobei als Wert immer Referenz auf ein Objekt übergeben wird. Genau wie in Java.
Geht das irgendwie?
Da Python keine C++-Referenzen kennt, musst du dir mit einer Dummy-Klasse oder einer 1-elementigen Liste behelfen.
Re: OOP Problem
Verfasst: Dienstag 2. März 2010, 21:36
von lunar
Darii hat geschrieben:[…] Als Übergabetyp kennt Python nur „per Value“ wobei als Wert immer Referenz auf ein Objekt übergeben wird. Genau wie in Java.
Man kann auch "call by object" oder "call by sharing" sagen, ich finde das knapper und präziser als das doch recht umständliche "call by value, wobei value Objektreferenzen sind".
Re: OOP Problem
Verfasst: Dienstag 2. März 2010, 21:51
von Darii
lunar hat geschrieben:Man kann auch "call by object" oder "call by sharing" sagen, ich finde das knapper und präziser als das doch recht umständliche "call by value, wobei value Objektreferenzen sind".
Ich sehe keinen Sinn darin, inflationär neue Begrifflichkeiten zu erfinden, die ja vorher auch erst genauso umständlich erklärt werden müssen. Die beiden von dir genannten Begriffe habe ich bis jetzt nur im Dunstkreis von Python gelesen. Ich befürchte deswegen, dass die Verwendung dieser Begrifflichkeiten den Eindruck erweckt, dass die Behandlung von Variablen bei Python irgendwas außergewöhnliches wäre. Das Gegenteil ist aber der Fall. Fast alle Scriptsprachen(mir fällt als Gegenbeispiel nur PHP4 ein) funktionieren so.
Verfasst: Dienstag 2. März 2010, 22:05
von lunar
Der Begriff "call by sharing" stammt von CLU, eine Sprache aus den Siebzigern, und ist damit nur unwesentlich "neuer" als "call by reference" und "call by value". Es ist eben nur kein Begriff für C und C++ Programmierer …
Siehe auch
Call By Object.
Verfasst: Dienstag 2. März 2010, 22:31
von SElsner
Vielen dank an euch alle, Darii, deine Erklärung leuchtet ein. Das heißt, dass ich die Liste mit den shots nur in ein Klasse zu tun brauche und schon gehts?! Werd ich morgen mal ausprobieren...
Verfasst: Dienstag 2. März 2010, 22:32
von Darii
lunar hat geschrieben:Der Begriff "call by sharing" stammt von CLU, eine Sprache aus den Siebziger, und ist damit nur unwesentlich "neuer" als "call by reference" und "call by value".
Das die Begrifflichkeit aus einer Sprache stammt, die heutzutage(und vermutlich auch damals) kein Mensch mehr kennt, macht es nicht besser. Den Begriff ist jedenfalls absolut unüblich. Und bevor ich irgendwem erkläre, was ich mit meiner esoterischen Terminologie meine, hab ich es zehnmal „auf C“ umständlich erklärt.
Es ist eben nur kein Begriff für C und C++ Programmierer …
Was soll jetzt der Nachsatz? Ich hab ihn jedenfalls im Smalltalk Blue Book nicht gefunden. Extra vorher gesucht.
Verfasst: Dienstag 2. März 2010, 22:40
von Leonidas
Darii hat geschrieben:Den Begriff ist jedenfalls absolut unüblich.
Also im entsprechenden Wikipedia-Artikel steht er durchaus so drin und ich würde nicht sagen dass das so esoterisch ist.
Darii hat geschrieben: Es ist eben nur kein Begriff für C und C++ Programmierer …
Was soll jetzt der Nachsatz? Ich hab ihn jedenfalls im Smalltalk Blue Book nicht gefunden. Extra vorher gesucht.
Also mit Smalltalk in Pythons OOP zu Argumentieren ist jetzt auch nicht sonderlich besser, nachdem wir ja schon etliche Male festgestellt haben, dass Pythons OOP eher wenig mit Smalltalk zu tun hat

Verfasst: Dienstag 2. März 2010, 22:46
von lunar
Verzeih mir, aber das ist mir jetzt zu dumm. Lies bitte meinen Beitrag. Ich habe keinen Anspruch auf den einzig wahren und richtigen Begriff erhoben, ich sagte ja nicht mal, dass er besser(TM) ist. Ich wollte lediglich einen alternativen, meiner persönlichen Meinung nach präziseren und daher passenderen Begriff erwähnen. Du kannst diesen Begriff jetzt nutzen, oder es sein lassen, mir ist das eigentlich ziemlich egal.
Der Nachsatz bezog sich nur darauf, dass C und C++ Programmierer diesen Begriff naturgemäß nicht kennen (sofern sie nicht Kontakt zu anderen Sprachen hatten), und dementsprechend versuchen, in "call by value" und "call by reference" zu denken. Das war weder eine Beleidigung, noch ein zynischer Seitenhieb, noch sonst irgendetwas fieses, sondern eine einfache, wertfreie Feststellung, ein simpler Versuch zu erklären, warum dieser Begriff eben keine so weite Verbreitung erlangt hat.
Wenn Du daraus jetzt eine Grundsatz-Diskussion machen möchtest, dann ohne mich …
Verfasst: Dienstag 2. März 2010, 22:48
von Darii
Leonidas hat geschrieben:Darii hat geschrieben:Den Begriff ist jedenfalls absolut unüblich.
Also im entsprechenden Wikipedia-Artikel steht er durchaus so drin und ich würde nicht sagen dass das so esoterisch ist.
Der existiert nicht, was meinst du? Abgesehen davon ist da natürlich kein Qualitätmerkmal. Da reicht nur ein Mensch der meinst der Begriff wäre toll & wichtig und schon ist es drin.
Also mit Smalltalk in Pythons OOP zu Argumentieren ist jetzt auch nicht sonderlich besser, nachdem wir ja schon etliche Male festgestellt haben, dass Pythons OOP eher wenig mit Smalltalk zu tun hat

Das worüber wir hier gerade reden, hat mit Pythons Objektmodell herzlich wenig zu tun. Die Semantik von Variablenzuweisungen ist bei Smalltalk jedenfalls identisch mit der von Python. Nur dass sich die meisten Smalltalk-Implementierungen nicht auf Referenzzählung verlassen.

Und da es das einzige 30 Jahre alte Beispiel ist, dass ich kenne und dass es genauso wie Python macht habe ich es eben genannt.
Verfasst: Dienstag 2. März 2010, 23:00
von Darii
lunar hat geschrieben:Verzeih mir, aber das ist mir jetzt zu dumm. Lies bitte meinen Beitrag.
Ja ich habe deinen Beitrag gelesen, sonst hätte ich ihn ja kaum zitiert. Keine Ahnung warum du jetzt so angefressen bist. Wenn ich deine Beiträge in Zukunft nicht mehr lesen soll schreib mir ne PM.
Ich wollte lediglich einen alternativen, meiner persönlichen Meinung nach präziseren und daher passenderen Begriff erwähnen.
Das ist ja auch dein gutes Recht. Aber dann musst du mir ebenso erlaube zu schreiben warum ich deine Meinung nicht teile. Ich bin auch nur intensiv drauf eingegangen, weil dieser Begriff hier öfter rumschwirrt.
Verfasst: Dienstag 2. März 2010, 23:28
von Leonidas
Darii hat geschrieben:Leonidas hat geschrieben:Darii hat geschrieben:Den Begriff ist jedenfalls absolut unüblich.
Also im entsprechenden Wikipedia-Artikel steht er durchaus so drin und ich würde nicht sagen dass das so esoterisch ist.
Der existiert nicht, was meinst du?
Doch, der existiert durchaus.
Darii hat geschrieben:Abgesehen davon ist da natürlich kein Qualitätmerkmal. Da reicht nur ein Mensch der meinst der Begriff wäre toll & wichtig und schon ist es drin.
Ich würde dennoch sagen dass es dadurch nicht so esoterisch ist wie du es darstellst.
Und eine Unterscheidung zum Call by reference gibt es ja durchaus, so sehr dass es eben Leute verwirrt. Da finde ich einen "neuen" Begriff gar nicht mal so abwegig.
Verfasst: Dienstag 2. März 2010, 23:29
von lunar
Darii hat geschrieben:Keine Ahnung warum du jetzt so angefressen bist.
Es nervt.

Ich wollte keinen Einstieg in eine Grundsatz-Diskussion liefern, geschweige denn eine führen … es geht hier schließlich um einen Begriff, nichts weiter, und ich finde es übertrieben, solche Begrifflichkeiten jetzt auszudiskutieren.
Wenn ich deine Beiträge in Zukunft nicht mehr lesen soll schreib mir ne PM.
Ach bitte …
Verfasst: Mittwoch 3. März 2010, 00:37
von jerch
Darii hat geschrieben:Es gibt keine elementaren Datentypen in Python nur Objekte. Als Übergabetyp kennt Python nur „per Value“ wobei als Wert immer Referenz auf ein Objekt übergeben wird. Genau wie in Java.
Für primitive Datentypen verwendet Java auch Wertparameter, für Objekte eine Objektreferenz als Wertparameter.
Ich finde es nicht sinnvoll, Pythons Parameterübergabe als "per Value" zu beschreiben. Als Anwender der Sprache interessieren mich nicht die Pointerdetails, die eine CPython-Implementation oder andere (wie wärs mit einer C++-Version mit echten C++-Referenzen?) im Hintergrund treiben. Phänomenologisch erinnert Pythons Verhalten am ehesten an "call by reference", wobei die Unterscheidung zwischen veränderlichen und unveränderlichen Datentypen plötzlich ein Feeling von "call by value" ins Spiel bringen. Wenn man den Leuten aber erklärt, daß in Python alles Objekte sind und was mit unveränderlichen Typen auf der rechten Seite der "Zuweisung" passiert und das eine Zuweisung eher einer Bindung an den Namen links entspricht, wird den meisten klar, daß das Verhalten nicht mit der klassischen Unterscheidung in "reference" oder "value" zu fassen ist. Ich finde "call by object" oder "call by object reference" da ganz passend.
Der Streit ist aber relativ akademischer Natur, wenn man dem Referenzbegriff etwas mehr Spielraum lässt (als z.B. im C++schen Sinne), geht das Verhalten als "call by reference" durch.
Sorry für soviel Grundsatzdiskussion.
Verfasst: Mittwoch 3. März 2010, 10:53
von SElsner
So, hab das mit der Dummy Klasse ausprobiert und funktioniert bis jetzt gut. Danke fuer den Tipp! Ring frei fuer weitere Grundsatzdiskussionen

Verfasst: Mittwoch 3. März 2010, 20:12
von Darii
jerch hat geschrieben:Ich finde es nicht sinnvoll, Pythons Parameterübergabe als "per Value" zu beschreiben.
Da stimme ich dir zu. Und so lange niemand von selbst mit Begrifflichkeiten wie „call by..“, „Referenz“ ankommt mache ich das auch nicht.
wobei die Unterscheidung zwischen veränderlichen und unveränderlichen Datentypen
Welche Unterscheidung? Python unterscheidet da nicht.
Verfasst: Mittwoch 3. März 2010, 20:21
von /me
Darii hat geschrieben:Und so lange niemand von selbst mit Begrifflichkeiten wie „call by..“, „Referenz“ ankommt mache ich das auch nicht.
Das Tutorial kommt damit an:
call by object reference
Wie auch immer es im Endeffekt aber genau heißt ist egal, so lange es keiner der klassischen C-Begriffe ist. Das Wichtige ist doch, dass man versteht was damit gemeint ist bzw. wie es funktioniert.