76 lines
1.6 KiB
Python
76 lines
1.6 KiB
Python
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"]
|
|
if shape_type == "circle":
|
|
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}')
|
|
|
|
@staticmethod
|
|
def convert_to_json(obj):
|
|
if isinstance(obj, Shape):
|
|
result = obj.__dict__
|
|
result["type"] = obj.__class__.__name__
|
|
return json.dumps(result)
|
|
|
|
|
|
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)
|