diff --git a/mod_oop/rvector2d.py b/mod_oop/rvector2d.py new file mode 100644 index 0000000..5f7a5f7 --- /dev/null +++ b/mod_oop/rvector2d.py @@ -0,0 +1,72 @@ +class RadiusVector2D: + MIN_COORD = -100 + MAX_COORD = 1024 + + def __init__(self, x=0, y=0): + self.__x, self.__y = 0, 0 + self.x, self.y = x, y + + def check_value(func): + def check(cls, value) -> bool: + return ( + isinstance(value, (int, float)) + and cls.MIN_COORD <= value <= cls.MAX_COORD + ) + + def decorator(func): + def wrapper(self, value): + if check(self.__class__, value): + return func(self, value) + + return wrapper + + return decorator(func) + + @property + def x(self): + return self.__x + + @x.setter + @check_value + def x(self, value): + self.__x = value + + @property + def y(self): + return self.__y + + @y.setter + @check_value + def y(self, value): + self.__y = value + + def norm2(self): + return self.x**2 + self.y**2 + + +r1 = RadiusVector2D() +r2 = RadiusVector2D(1) +r3 = RadiusVector2D(4, 5) + +assert hasattr(RadiusVector2D, "MIN_COORD") and hasattr( + RadiusVector2D, "MAX_COORD" +), "в классе RadiusVector2D должны присутствовать атрибуты MIN_COORD и MAX_COORD" +assert ( + type(RadiusVector2D.x) == property and type(RadiusVector2D.y) == property +), "в классе RadiusVector2D должны присутствовать объекты-свойства x и y" +assert ( + r1.x == 0 and r1.y == 0 and r2.x == 1 and r2.y == 0 and r3.x == 4 and r3.y == 5 +), "свойства x и y возвращают неверные значения" +assert RadiusVector2D.norm2(r3) == 41, "неверно вычисляется норма вектора" +r4 = RadiusVector2D(4.5, 5.5) +assert ( + 4.4 < r4.x < 4.6 and 5.4 < r4.y < 5.6 +), "свойства x и y возвращают неверные значения" +r5 = RadiusVector2D(-102, 2000) +assert ( + r5.x == 0 and r5.y == 0 +), "присвоение значений, выходящих за диапазон [-100; 1024] не должно выполняться" +r = RadiusVector2D(10, 20) +r.x = "a" +r.y = (1, 2) +assert r.x == 10 and r.y == 20, "присвоение не числовых значений должно игнорироваться"