py_stepik/mod_oop/rvector2d.py

73 lines
2.3 KiB
Python
Raw Permalink Normal View History

2024-04-08 13:22:01 +00:00
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, "присвоение не числовых значений должно игнорироваться"