Pythonischer Setter meldet Fehler, aber normale Setter-Methode funktioniert

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
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Hallo

Im unteren Beispiel zum Festlegen von Koordinaten habe ich Getter und Setter ganz pythonisch als `property` umgesetzt. Der pythonische Setter schlägt aber mit folgender Fehlermeldung fehl:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/ata/source/property-test.py", line 21, in <module>
    element.coordinates((7, 2, 9))
TypeError: 'tuple' object is not callable
Eine normale Setter-Methode (`set_coordinates()`) zum Festlegen der Koordinaten funktioniert hingegen problemlos. Unterstützt der pythonische Setter keine Tupel?

Code: Alles auswählen

class Element:
    def __init__(self, x, y, z):
        self._x = x
        self._y = y
        self._z = z

    @property
    def coordinates(self):
        return self._x, self._y, self._z

    @coordinates.setter
    def coordinates(self, new_coordinate):
        self._x, self._y, self._z = new_coordinate

    def set_coordinates(self, new_coordinate):
        self._x, self._y, self._z = new_coordinate

element = Element(10, 5, 8)
element.set_coordinates((5, 3, 8))
print(element.coordinates)

element.coordinates((7, 2, 9))
Gruß
Atalanttore
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Properties werden wie Attribute benutzt:

Code: Alles auswählen

element.coordinates = (7, 2, 9)
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@Sirius3: Also ein Denkfehler meinerseits.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@Atalanttore: warum hast du ein Property-Setter `coordinates` und zusätzlich eine Methode `set_coordinates`?
When we say computer, we mean the electronic computer.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@sls: Zur Demonstration, dass die normale Setter-Methode funktioniert, aber der pythonische `property`-Setter wegen meinem Denkfehler nicht (siehe Beitrag von Sirius3).

Gruß
Atalanttore
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@Atalanttore: falls du dir den Part zu Properties noch nicht in der offiziellen Doku reingezogen hast: https://docs.python.org/3/library/funct ... y#property

Da wird eigentlich schnell klar warum die Zuweisung direkt geschieht: das Property-Objekt ist ein spezielles Attribut im Namensraum deiner Klasse. Der Dekorator `@property` nimmt dir diese Magie ab.
When we say computer, we mean the electronic computer.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@sls: Reingezogen schon, aber nicht mehr dran gedacht.
Antworten