Value Object — объект без идентичности, определяется значениями полей. Money(100, "USD") == Money(100, "USD") — одинаковые. В Python: frozen dataclass — @dataclass(frozen=True). Или NamedTuple. Неизменяемый, сравнивается по значению. Примеры: Email, PhoneNumber, Address, DateRange, Coordinates. Содержит валидацию: class Email: def __post_init__(self): if "@" not in self.value: raise ValueError. Value Object может иметь методы: money.add(other_money). Помогает избежать Primitive Obsession — не передавай строки, передавай типизированные объекты.