Используем @classmethod для создания альтернативного конструктора:
class MyClass:
    def __init__(self, data1, data2):
      self.data1 = data1
      self.data2 = data2
    @classmethod
    def from_db(cls, db_id):
      # Загружаем данные из базы данных по db_id
      db_data = get_data_from_db(db_id)
      return cls(db_data['data1'], db_data['data2'])
    @classmethod
    def from_file(cls, filename):
      # Загружаем данные из файла
      with open(filename, 'r') as f:
        file_data = json.load(f) #или другой формат
      return cls(file_data['data1'], file_data['data2'])
  Пример использования:
obj_from_db = MyClass.from_db(123)
  obj_from_file = MyClass.from_file('my_data.json')
  
    Реализовать конструктор, создающий объекты на основе данных из базы данных или файлов, можно несколькими способами.  Основная идея заключается в том, чтобы в самом конструкторе (`__init__`) предусмотреть возможность загрузки данных из разных источников и инициализировать объект этими данными.  Ниже представлен пример подхода с использованием статического метода from_source, который выполняет загрузку и создание объекта. Это позволяет сохранить конструктор (`__init__`) чистым и предназначенным только для инициализации уже имеющихся данных.
  
Пример реализации:
    
class MyObject:
    def __init__(self, data1, data2, ...):
        """Инициализирует объект, принимая данные."""
        self.data1 = data1
        self.data2 = data2
        # ... другие атрибуты
    @staticmethod
    def from_database(db_connection, object_id):
        """Создает объект из базы данных."""
        try:
            cursor = db_connection.cursor()
            cursor.execute("SELECT data1, data2 FROM my_table WHERE id = %s", (object_id,))
            result = cursor.fetchone()
            if result:
                data1, data2 = result  # извлекаем данные из результата запроса
                return MyObject(data1, data2)  # Создаем и возвращаем объект
            else:
                return None  # Объект не найден
        except Exception as e:
            print(f"Ошибка при загрузке из БД: {e}")
            return None
    @staticmethod
    def from_file(file_path):
        """Создает объект из файла."""
        try:
            with open(file_path, 'r') as f:
                # Предпологаем, что в файле данные в формате "data1=value1\ndata2=value2"
                data = {}
                for line in f:
                    key, value = line.strip().split('=')
                    data[key] = value
                # Преобразуем строки в нужные типы данных (например, int, float)
                data1 = data.get('data1') #get вернет None если ключа нет
                data2 = data.get('data2')
                if data1 is not None and data2 is not None:
                  return MyObject(data1, data2)
                else:
                  return None #Ошибка в файле
        except FileNotFoundError:
            print(f"Файл не найден: {file_path}")
            return None
        except Exception as e:
            print(f"Ошибка при загрузке из файла: {e}")
            return None
# Пример использования:
# Загрузка из базы данных:
# db_connection = ... # Устанавливаем соединение с базой данных
# obj_from_db = MyObject.from_database(db_connection, 123)
# Загрузка из файла:
# obj_from_file = MyObject.from_file("my_object_data.txt")
# Проверка, что объект создан:
# if obj_from_db:
#     print(obj_from_db.data1)
    
  
  Пояснения:
Альтернативные подходы:
Выбор конкретного подхода зависит от сложности проекта и требований к гибкости и тестируемости. Представленный пример с `from_source` является хорошей отправной точкой для большинства случаев.