Eine kleine Frage zu OOP (Python 3.1)

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.
Antworten
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

BlackJack hat geschrieben:@Nocta: Nicht die Zuweisung kopiert ein "immutable"s Object, sondern eventuell eine Operation, die man darauf aufruft. Auf der Ebene der Zuweisung passiert immer das Gleiche, egal was für ein Objekt da zugewiesen wird.
Ja ich hab mich etwas geschickt ausgedrückt, aber du hast natürlich recht damit :)
Klar kannst Du Dir vorstellen, dass immutable Objekte kopiert werden. Aber *warum*? Damit hast Du in Gedanken eine Unterscheidung, die keine Auswirkungen hat.
Naja, in der Physik stellt man sich auch vereinfacht anhand von Modellen Dinge vor, die gar nicht so sind :) Aber vielleicht hast du auch recht und mein "Modell" vereinfacht das ganze nicht, sondern verkompliziert es.
Naja, meine Frage hast du ja beantwortet, man kann sich das also so vorstellen. Und das war eigentlich das Ziel meiner Frage. Ich will nicht unbedingt diese Vorstellung von einer Kopie in meinem Kopf verankern, sondern wollte eher das neu gelernte mit meinen alten Erfahrungswerten in Einklang bringen. Das ist glaube ich menschlich ;)
Gemischte Objekte gibt es IMHO nicht.
Okay, wenn man das so sieht, ist es wirklich sinnfrei, noch gemischte Objekte zu unterscheiden. Ich wollte nur noch mal sichergehen, ob ich das ganze richtig verstanden habe.
Datentypen sind also nicht zwingend in allen Eigenschaften immutable oder mutable, sondern es kommt darauf an, wie die jeweilige Operation definiert ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nocta hat geschrieben:Naja, in der Physik stellt man sich auch vereinfacht anhand von Modellen Dinge vor, die gar nicht so sind :) Aber vielleicht hast du auch recht und mein "Modell" vereinfacht das ganze nicht, sondern verkompliziert es.
Weil in der Pyhsik die Modelle wesentlich komplizierter sind. Das Objektmodell in Python ist eigentlich recht simpel, man könnte direkt sagen primitiv. Ab dem Zeitpunkt ab dem man es verstanden aht, dass es eigentlich keine Unterscheidung zwischen Immutablen Objekten und mutablen Objekten gibt wird es direkt schon langweilig ;)

Naja, meine Frage hast du ja beantwortet, man kann sich das also so vorstellen. Und das war eigentlich das Ziel meiner Frage. Ich will nicht unbedingt diese Vorstellung von einer Kopie in meinem Kopf verankern, sondern wollte eher das neu gelernte mit meinen alten Erfahrungswerten in Einklang bringen. Das ist glaube ich menschlich ;)
Nocta hat geschrieben:Datentypen sind also nicht zwingend in allen Eigenschaften immutable oder mutable, sondern es kommt darauf an, wie die jeweilige Operation definiert ist.
IMHO kommt es eher darauf an was man mit dem Objekt macht: wenn es immutable ist kann man es verändern ansonsten erstellt man ein *neues* Objekt, das bestimmte Daten aus dem alten Objekt übernimmt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Nocta hat geschrieben:Datentypen sind also nicht zwingend in allen Eigenschaften immutable oder mutable, sondern es kommt darauf an, wie die jeweilige Operation definiert ist.
Wenn ein Datentyp hinsichtlich einer noch so kleinen kleinigkeit Mutabel ist, ist er nicht mehr Immutabel.

Mal an einem Beispiel. Sei Date eine Klasse, die ein Kalendarisches Datum darstellt.

Code: Alles auswählen

alice = Human()
bob = Human()
alice.birthday = Date(year=1984, month=5, day=23)
bob.birthday = alice.birthday
Alice und Bob haben nun am gleichen Tag Geburtstag.
Technisch verweisen sowohl alice.birthday und bob.birthday auf das selbe Objekt im Speicher.

So, man will nun irgendwelche Datumsrechnereien programmieren.

Wenn wir das mutabel machen, nämlich so:

Code: Alles auswählen

class Datum(object):
   # ...
   def add_day(self, days):
        self.day += days      # jaja, nicht perfekt
hätte das lustige Folgen, auch wenn das Datumn nach deiner Logik immer noch "immutabel hinsichtlich bestimmter eigenschaften", z.B. des Jahres ist.

Code: Alles auswählen

alice.birthday.add_days(1)
assert bob.birthday.day == 24
da sich die Eigenschaften des Datumsobjektes geändert haben, das Objekt allerdings mit bob geteilt wurde, hat man den direkt aus versehen mitgeändert.

Weshalb wir das Objekt immutabel machen, indem wir es IN KEINER HINSICHT mutabel machen:

Code: Alles auswählen

class Date(object):
    # ...
    def add_days(self, days):
        return Date(year=self.year, month=self.month, day=self.day + days)

alice.birthday = alice.birtday.add_days(1)
assert alice.birthday.day == 24
assert bob.birthday.day == 23
Hier wird nicht das alte Objekt geändert, sondern ein neues erzeugt, welches alice' dann als Geburtstag gesetzt bekommt.

Also: Mutabel ist wie Schwanger: "ein bisschen" oder "gemischt" geht nicht.
Antworten