Когда вы вызываете MyClass()
после того, как он оформлен, вы правы - вы на самом деле не вызываете класс, вы вызываете функцию.
Эта функция вызывает класс if cls not in instances
и кэширует его, затем возвращает кэшированный экземпляр.
Другими словами, нет никакой причины, по которой MyClass()
должен вызывать класс напрямую - он будет работать, как и ожидалось, до тех пор, пока он возвращает экземпляр класса.