diff --git a/app/main.py b/app/main.py index 6d375672..efbc74d1 100644 --- a/app/main.py +++ b/app/main.py @@ -2,24 +2,96 @@ class IntegerRange: - pass + def __init__(self, min_amount: int, max_amount: int) -> None: + self.min_amount = min_amount + self.max_amount = max_amount + + def __get__(self, instance: object, owner: object) -> object: + return getattr(instance, self.protected_name) + + def __set__(self, instance: object, value: int) -> None: + if not isinstance(value, int): + raise TypeError(f"Expected an int, got {type(value)}") + + if not (self.min_amount <= value <= self.max_amount): + raise ValueError( + f"Value must be between " + f"{self.min_amount} and {self.max_amount}" + ) + + setattr(instance, self.protected_name, value) + + def __set_name__(self, owner: object, name: str) -> None: + self.protected_name = f"_{name}" class Visitor: - pass + def __init__( + self, + name: str, + age: int, + weight: int, + height: int + ) -> None: + self.name = name + self.age = age + self.weight = weight + self.height = height class SlideLimitationValidator(ABC): - pass + def __init__( + self, + age: int, + weight: int, + height: int + ) -> None: + self.age = age + self.weight = weight + self.height = height class ChildrenSlideLimitationValidator(SlideLimitationValidator): - pass + age = IntegerRange(4, 14) + height = IntegerRange(80, 120) + weight = IntegerRange(20, 50) class AdultSlideLimitationValidator(SlideLimitationValidator): - pass + age = IntegerRange(14, 60) + height = IntegerRange(120, 220) + weight = IntegerRange(50, 120) class Slide: - pass + def __init__( + self, + name: str, + limitation_class: SlideLimitationValidator + ) -> None: + self.name = name + self.limitation_class = limitation_class + + def can_access(self, visitor: Visitor) -> bool: + try: + self.limitation_class( + age=visitor.age, + weight=visitor.weight, + height=visitor.height + ) + except TypeError as e: + print( + f"{visitor.name} can't access, " + f"has an attribute with incorrect type!", + e + ) + except ValueError as e: + print( + f"{visitor.name} can't access, " + f"doesn't meet the requirements!", + e + ) + else: + return True + + return False