import json from abc import abstractmethod from abc import ABC import math class Shape(ABC): color = '' @abstractmethod def area(self): pass @abstractmethod def perimetr(self): pass @staticmethod def create_shape(json): if "type" in json: shape_type = json["type"].lower() if shape_type == "circle": radius = return Circle(json["radius"]) elif shape_type == "square": return Square(json["side"]) elif shape_type == "rectangle": return Rectangle(json["width"], json["height"]) else: raise TypeError(f'Неизвестная фигура {shape_type}') shape_type.color = safe_read(json, "color", "unknown") @staticmethod def convert_to_json(obj): global result if isinstance(obj, Shape): result = obj.__dict__ result["type"] = obj.__class__.__name__ return result def safe_read (shape_type, property, default_value): if property in shape_type: return shape_type[property] return default_value class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height def perimetr(self): return (self.width + self.height) * 2 class Square(Shape): def __init__(self, side): self.side = side def area(self): return self.side ** 2 def perimetr(self): return 4 * self.side class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return math.pi * (self.radius ** 2) def perimetr(self): return 2 * math.pi * self.radius r1 = Rectangle(10, 20) s1 = Square(22) c1 = Circle(10)