Подсчитывание срабатываний статических методов

Есть класс с подсчетом площади фигур (реализация через статические методы нужна по заданию)

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
→ Ссылка