Подсчитывание срабатываний статических методов
Есть класс с подсчетом площади фигур (реализация через статические методы нужна по заданию)
import math
class FigureCalc:
@staticmethod
def tri_heron(a, b, c):
semi_per = (a + b + c) / 2
area = math.sqrt(semi_per * (semi_per - a) * (semi_per - b) * (semi_per - c))
return area
@staticmethod
def tri_base(base, height):
return (base * height) / 2
@staticmethod
def square_area(a):
return a**2
@staticmethod
def rect_area(a, b):
return a*b
@staticmethod
def area_calc_counter():
pass
print(FigureCalc.tri_heron(3, 4, 5))
print(FigureCalc.tri_base(6, 7))
print(FigureCalc.square_area(7))
print(FigureCalc.rect_area(2, 6))
# print(FigureCalc.area_calc_counter())
6.0
21.0
49
12
По заданию нужен еще статический метод который будет считать сколько раз была высчитана площадь (кол-во срабатываний всех методов) @staticmethod area_calc_counter():
ТЕ в ответе должно выйти:
6.0
21.0
49
12
4
Вопрос в том, как подсчитать кол-во срабатываний методов, если в статический метод нельзя передавать переменные по типу counter и тп?
З.Ы. __init__ отсутствует по заданию
Ответы (2 шт):
Автор решения: Павел
→ Ссылка
С точки зрения архитектуры мне больше всего нравится такой вариант c декоратором:
import math
def count_calls(decor_func):
def func(*args, **kwargs):
FigureCalc.calc_counter += 1
return decor_func(*args, **kwargs)
return func
class FigureCalc:
calc_counter = 0
@staticmethod
@count_calls
def tri_heron(a, b, c):
semi_per = (a + b + c) / 2
area = math.sqrt(semi_per * (semi_per - a) * (semi_per - b) * (semi_per - c))
return area
@staticmethod
@count_calls
def tri_base(base, height):
return (base * height) / 2
@staticmethod
@count_calls
def square_area(a):
return a ** 2
@staticmethod
@count_calls
def rect_area(a, b):
return a * b
@staticmethod
def area_calc_counter():
return FigureCalc.calc_counter
print(FigureCalc.tri_heron(3, 4, 5)) # 6.0
print(FigureCalc.tri_base(6, 7)) # 21.0
print(FigureCalc.square_area(7)) # 49
print(FigureCalc.rect_area(2, 6)) # 12
print(FigureCalc.area_calc_counter()) # 4
Автор решения: bruh
→ Ссылка
Помимо принятого ответа оставляю еще свой, на который подтолкнули @Sergey K. и @CrazyElf в комментах
import math
class FigureCalc:
counter = 0
@staticmethod
def tri_heron(a, b, c):
semi_per = (a + b + c) / 2
area = math.sqrt(semi_per * (semi_per - a) * (semi_per - b) * (semi_per - c))
FigureCalc.counter += 1
return area
@staticmethod
def tri_base(base, height):
FigureCalc.counter += 1
return (base * height) / 2
@staticmethod
def square_area(a):
FigureCalc.counter += 1
return a**2
@staticmethod
def rect_area(a, b):
FigureCalc.counter += 1
return a*b
@staticmethod
def area_calc_counter():
return FigureCalc.counter
print(FigureCalc.tri_heron(3, 4, 5))
print(FigureCalc.tri_base(6, 7))
print(FigureCalc.square_area(7))
print(FigureCalc.rect_area(2, 6))
print(FigureCalc.area_calc_counter())
6.0
21.0
49
12
4