Как сделать, чтобы не экземпляр , а сам класс возвращал значение?

Предположим есть class Square(): Реально ли сделать так, чтобы при вызове print(Square(5)) выводилось 25 , т.е. типа квадрат стороны? Я попробовал через __call__, но у меня это работает только с экземплярами класса, а если делать через переопределение __str__ / __repr__, то можно вернуть только строку, а мне необходимо вернуть именно число, чтобы потом была возможность сделать из аналогичных классов список для сортировки.

Заранее спасибо!


Ответы (2 шт):

Автор решения: Валерий
class Square():
    def __init__(self,n):
        self.value=n**2
        
print(Square(5).value)
→ Ссылка
Автор решения: extrn

Вариантов много, вот некоторые:

  1. Переопределяем __new__
class Square:
    def __new__(cls, x):
        return x * x
  1. Переопредяем __call__ метакласса
class M(type):
    def __call__(self, x):
        return x * x

class Square(metaclass=M):
    pass
  1. Наследуемся от int, переопредеяем конструктор
class Square(int):
    def __new__(cls, x):
        return int.__new__(cls, x * x)
  1. Переопредяем метод преобразования объекта в строковое представление
class Square:
    def __init__(self, x):
        self.x = x

    def __repr__(self):
        return f'{self.x ** 2}'
→ Ссылка