Richtige/sinnvolle Verwendung von Property
Verfasst: Donnerstag 28. August 2025, 07:39
Hallo zusammen,
ich habe mal wieder eine Frage zu "wie macht man es richtig". Aktuell habe ich folgende Struktur, hier als Minimalbeispiel:
Macht das mit `property` hier Sinn? Ich finde es ganz geschickt, weil ich sicherstellen kann, dass der Wert berechnet wird. An sich könnte ich das Ergebnis von `calculate_volume` auch direkt an das Attribut `volume` der `Cylinder` - Klasse binden, weil ich durch `__attrs_post_init` sicherstelle, dass die Methode aufgerufen wird.
Wie wäre hier der richtige Weg?
Die Attribute sind den Klassen so zugeordnet, wie sie auch in "echt" sind. Es wäre zum Beispiel technisch nicht richtig wenn ich `length` dem Zylinder zuweise und würde dann das physische Objekt nicht richtig wieder spiegeln.
Danke und Grüße
Dennis
ich habe mal wieder eine Frage zu "wie macht man es richtig". Aktuell habe ich folgende Struktur, hier als Minimalbeispiel:
Code: Alles auswählen
#!/usr/bin/env python
from attrs import define, field
@define
class Cylinder:
double = field()
area = field()
hole_area = field()
_volume = field(default=None)
@property
def volume(self):
"""
`calculate_volume`have to be called once before you can access this property.
:raise ValueError: If `calculate_volume`is not be called before volume-access.
:return float: volume in cubic-meter
"""
if self._volume is None:
raise ValueError(
"Stroke-volume have to be calculated first. Call `calculate_stroke_volume`."
)
return self._volume
def calculate_volume(self, length):
"""
Depending on double acting the volume will be calculated.
:param int|float length: In meter
"""
area = self.area - self.hole_area if self.double else self.area
self._volume = area * length
@define
class Machine:
cylinders: list[Cylinder] = field()
length = field()
def __attrs_post_init__(self):
for cylinder in self.cylinders:
cylinder.calculate_volume(self.length)
def main():
machine = Machine([Cylinder(100, 20, False)], 150)
for cylinder in machine.cylinders:
print(cylinder.volume)
if __name__ == "__main__":
main()
Wie wäre hier der richtige Weg?
Die Attribute sind den Klassen so zugeordnet, wie sie auch in "echt" sind. Es wäre zum Beispiel technisch nicht richtig wenn ich `length` dem Zylinder zuweise und würde dann das physische Objekt nicht richtig wieder spiegeln.
Danke und Grüße
Dennis