Erklärung zur Lektion
@propertyNach dieser Lektion kannst du:
@property bereitstellen.Python verwendet keine private-Felder im Stil von Java. Ein Name wie _balance signalisiert interne Verwendung per Konvention; er ist kein starker Zugriffsschutz. Mit einer Property kann externer Code account.balance lesen, während im Hintergrund eine Methode den Wert berechnet oder validiert.
Definiere einen Getter mit @property. Für schreibbare Properties fügst du einen Setter mit @property_name.setter hinzu. Schreibe in einem Setter in das zugrunde liegende Feld (self._balance), nicht in den Property-Namen (self.balance), sonst ruft sich der Setter immer wieder selbst auf.
Eine Property kann auch schreibgeschützt sein: Lass dazu den Setter weg. Berechnete Properties sollten zum aktuellen Objektzustand passen. Verwende Properties für sinnvolle Validierung oder Berechnung, nicht nur, um ausführliche Getter und Setter aus Java nachzubilden.
_status speichert den Wert, und status bietet eine saubere Leseschnittstelle.
class Task:
def __init__(self, status):
self._status = status
@property
def status(self):
return self._status
print(Task("queued").status)Ausgabe:
queuedDer Setter weist negative Werte zurück und bewahrt den bisherigen Wert.
class Counter:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, next_value):
if next_value >= 0:
self._value = next_value
counter = Counter(3)
counter.value = -8
print(counter.value)Ausgabe:
3Es muss kein separates Feld remaining synchron gehalten werden.
class Quota:
def __init__(self, limit, used):
self.limit = limit
self.used = used
@property
def remaining(self):
return self.limit - self.used
quota = Quota(100, 35)
print(quota.remaining)Ausgabe:
65Verwende den Attributzugriff statt Klammern; der Getter der Property läuft automatisch.
class Release:
def __init__(self, passed):
self.passed = passed
@property
def ready(self):
return self.passed > 0
release = Release(2)
print(f"Ready: {release.ready}")Ausgabe:
Ready: True| Bedarf | Verwende |
|---|---|
| Konvention für interne Felder | self._value |
| Öffentlicher Lesezugriff | @property-Getter |
| Validierter Schreibzugriff | @value.setter |
| Berechneter Wert | Schreibgeschützte Property ohne Setter |
| Rekursive Setter vermeiden | Das zugrunde liegende Feld zuweisen, nicht self.value |
obj.total()), statt sie zu lesen (obj.total).self.value = ... im Setter für value zuweisen._value außerhalb der Klasse nicht zugegriffen werden kann; es ist nur eine Konvention.