Descriptors
Descriptors define how attribute access works. Implement __get__, __set__, and __delete__ to create validated, computed, or lazily-loaded attributes.
Descriptors define how attribute access works. Implement __get__, __set__, and __delete__ to create validated, computed, or lazily-loaded attributes.
class Positive:
def __set_name__(self, owner, name): self.name = name
def __get__(self, obj, objtype=None):
if obj is None: return self
return obj.__dict__.get(self.name)
def __set__(self, obj, value):
if value <= 0: raise ValueError(f"{self.name} must be positive")
obj.__dict__[self.name] = value
class Product:
price = Positive()
quantity = Positive()
p = Product()
p.price = 9.99 # OK
p.price = -1 # ValueError
property() is a descriptor — __get__, __set__, __delete__ are its primitives.