from dataclasses import InitVar, dataclass, field import unittest @dataclass(init=False) class Rectangle: name: str = field(init=True) height: float = field(init=False) width: float = field(init=False) nickname: InitVar[str] def append_nickname(self, nickname: str) -> None: self.name = "{} ({})".format(self.name, nickname) def __post_init__(self, nickname: str) -> None: self.append_nickname(nickname) def __init__(self, name: str, height: float, width: float, nickname: str) -> None: self.name = name self.height = height self.width = width self.__post_init__(nickname=nickname) def area(self) -> float: return self.height * self.width @dataclass class Square(Rectangle): side: float = field(init=True) def __post_init__(self, nickname: str) -> None: self.append_nickname(nickname) self.height = self.side self.width = self.side class DataClassRectangleTestCase(unittest.TestCase): def setUp(self) -> None: self.rectangle: Rectangle = Rectangle( name="Test Rectangle", nickname="Base Data Class", height=4, width=25 ) return super().setUp() def test_Dataclass(self) -> None: self.assertEqual(self.rectangle.height, 4) self.assertEqual(self.rectangle.width, 25) self.assertEqual(self.rectangle.name, "Test Rectangle (Base Data Class)") self.assertEqual(self.rectangle.area(), 100) class DataClassSquareTestCase(unittest.TestCase): def setUp(self) -> None: self.square: Square = Square( nickname="Child Data Class", name="Test Square", side=10 ) return super().setUp() def test_Dataclass(self) -> None: self.assertEqual(self.square.side, 10) self.assertEqual(self.square.height, 10) self.assertEqual(self.square.width, 10) self.assertEqual(self.square.name, "Test Square (Child Data Class)") self.assertEqual(self.square.area(), 100) if __name__ == "__main__": unittest.main()