python / expert
Snippet
Deskriptor-Protokoll für Typsicherheit
Deskriptoren sind Klassen, die eine der Methoden __get__, __set__ oder __delete__ definieren. Sie werden verwendet, um benutzerdefinierte Logik für den Attributzugriff zu implementieren. In diesem Snippet erfasst __set_name__ automatisch den Attributnamen und __set__ erzwingt, dass der dem 'age' zugewiesene Wert immer eine Ganzzahl ist.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
class IntegerField:def __set_name__(self, owner, name):self.name = namedef __set__(self, instance, value):if not isinstance(value, int):raise ValueError(f'{self.name} must be an integer')instance.__dict__[self.name] = valueclass User:age = IntegerField()
Erklärung
1
def __set_name__(self, owner, name):
Wird bei der Klassenerstellung aufgerufen, um den dem Deskriptor zugewiesenen Namen zu erfahren.
2
def __set__(self, instance, value):
Wird aufgerufen, wann immer dem verwalteten Attribut ein Wert zugewiesen wird.
3
instance.__dict__[self.name] = value
Speichert den Wert im Dictionary der Instanz, um unendliche Rekursion zu vermeiden.