Skip to content

Commit f66f6d4

Browse files
committed
Add slots to value objects
1 parent ff14f02 commit f66f6d4

8 files changed

Lines changed: 19 additions & 10 deletions

File tree

src/app/domain/value_objects/base.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ def __post_init__(self) -> None:
3333
Hook for additional initialization and ensuring invariants.
3434
Subclasses can override this method to implement custom logic, while
3535
still calling `super().__post_init__()` to preserve base checks.
36+
37+
Note on slotted dataclasses:
38+
With `slots=True`, the dataclass transformation may replace the class
39+
object; a zero-arg `super()` in a subclass `__post_init__` can then raise
40+
`TypeError`. In such cases, call the base with two-arg super, e.g.:
41+
`super(Username, self).__post_init__()`
42+
(or invoke directly: `ValueObject.__post_init__(self)`).
43+
44+
Reference: https://github.com/python/cpython/issues/90562
3645
"""
3746
self.__forbid_base_class_instantiation()
3847
self.__check_field_existence()

src/app/domain/value_objects/raw_password.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from app.domain.value_objects.base import ValueObject
66

77

8-
@dataclass(frozen=True, repr=False)
8+
@dataclass(frozen=True, slots=True, repr=False)
99
class RawPassword(ValueObject):
1010
"""raises DomainFieldError"""
1111

@@ -15,7 +15,7 @@ class RawPassword(ValueObject):
1515

1616
def __post_init__(self) -> None:
1717
""":raises DomainFieldError:"""
18-
super().__post_init__()
18+
super(RawPassword, self).__post_init__()
1919
self._validate_password_length(self.value)
2020

2121
def _validate_password_length(self, password_value: str) -> None:

src/app/domain/value_objects/user_id.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
from app.domain.value_objects.base import ValueObject
55

66

7-
@dataclass(frozen=True, repr=False)
7+
@dataclass(frozen=True, slots=True, repr=False)
88
class UserId(ValueObject):
99
value: UUID

src/app/domain/value_objects/user_password_hash.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
from app.domain.value_objects.base import ValueObject
44

55

6-
@dataclass(frozen=True, repr=False)
6+
@dataclass(frozen=True, slots=True, repr=False)
77
class UserPasswordHash(ValueObject):
88
value: bytes

src/app/domain/value_objects/username.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from app.domain.value_objects.base import ValueObject
77

88

9-
@dataclass(frozen=True, repr=False)
9+
@dataclass(frozen=True, slots=True, repr=False)
1010
class Username(ValueObject):
1111
"""raises DomainFieldError"""
1212

@@ -35,7 +35,7 @@ class Username(ValueObject):
3535

3636
def __post_init__(self) -> None:
3737
""":raises DomainFieldError:"""
38-
super().__post_init__()
38+
super(Username, self).__post_init__()
3939
self._validate_username_length(self.value)
4040
self._validate_username_pattern(self.value)
4141

tests/app/unit/factories/named_entity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from app.domain.value_objects.base import ValueObject
55

66

7-
@dataclass(frozen=True, repr=False)
7+
@dataclass(frozen=True, slots=True, repr=False)
88
class NamedEntityId(ValueObject):
99
value: int
1010

tests/app/unit/factories/tagged_entity.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from app.domain.value_objects.base import ValueObject
55

66

7-
@dataclass(frozen=True, repr=False)
7+
@dataclass(frozen=True, slots=True, repr=False)
88
class TaggedEntityId(ValueObject):
99
value: int
1010

tests/app/unit/factories/value_objects.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
from app.domain.value_objects.username import Username
1010

1111

12-
@dataclass(frozen=True, repr=False)
12+
@dataclass(frozen=True, slots=True, repr=False)
1313
class SingleFieldVO(ValueObject):
1414
value: int
1515

1616

17-
@dataclass(frozen=True, repr=False)
17+
@dataclass(frozen=True, slots=True, repr=False)
1818
class MultiFieldVO(ValueObject):
1919
value1: int
2020
value2: str

0 commit comments

Comments
 (0)