OOP Problem

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.
SElsner
User
Beiträge: 15
Registriert: Dienstag 22. Juli 2008, 14:24

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
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".
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
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.
SElsner
User
Beiträge: 15
Registriert: Dienstag 22. Juli 2008, 14:24

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...
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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 …
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
Zuletzt geändert von Leonidas am Dienstag 2. März 2010, 23:29, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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 …
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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.
SElsner
User
Beiträge: 15
Registriert: Dienstag 22. Juli 2008, 14:24

So, hab das mit der Dummy Klasse ausprobiert und funktioniert bis jetzt gut. Danke fuer den Tipp! Ring frei fuer weitere Grundsatzdiskussionen :D
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten