Descriptors — protocol for managing attribute access.
1class Validator:2 def __init__(self, min_value=None, max_value=None):3 self.min_value = min_value4 self.max_value = max_value56 def __set_name__(self, owner, name):7 self.name = name89 def __get__(self, obj, objtype=None):10 if obj is None:11 return self12 return obj.__dict__.get(self.name)1314 def __set__(self, obj, value):15 if self.min_value is not None and value < self.min_value:16 raise ValueError(f"{self.name} must be >= {self.min_value}")17 if self.max_value is not None and value > self.max_value:18 raise ValueError(f"{self.name} must be <= {self.max_value}")19 obj.__dict__[self.name] = value2021class Student:22 age = Validator(min_value=0, max_value=150)23 grade = Validator(min_value=1, max_value=12)2425s = Student()26s.age = 25 # OK27# s.age = -5 # ValueError!
Protocol: