capypad
0 Tage Serie
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
python
1
2
3
4
5
6
7
8
9
10
11
class IntegerField:
def __set_name__(self, owner, name):
self.name = name
 
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'{self.name} must be an integer')
instance.__dict__[self.name] = value
 
class 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.