У меня есть класс, конструктор которого становится слишком сложным, поэтому я хотел использовать шаблон компоновщика для управления всеми этапами построения.
Важная часть приложения зависит от старого способа создания экземпляров. класс, так что я не могу просто заменить их все в одном go. Я использовал декоратор, чтобы пометить некоторые методы как устаревшие, но я хотел бы выдать предупреждение, если экземпляр класса создается вне класса построителя.
Чтобы дать немного больше контекста, конструктор Исходный класс (Inverter
) выглядит следующим образом:
def __init__(self, inverter_id: str, location: Tuple[str, str], plant_id: str,
customer_id: str, power_threshold: float = 0, resolution: int = 5,
**kwargs):
"""
Creates a new inverter object.
:param inverter_id:
unique identifier of the inverter.
"""
# metrics initialization
self._customer_id = customer_id
self._plant_id = plant_id
self._expected_power = DataFrame()
self._generated_power = DataFrame()
self._total_pr = 0.0
self._specific_performance = 0.0
self._active_pr = 0.0
self._generated_energy = 0.0
self._expected_energy = 0.0
self.__operational_time = {}
self.__off_time = {}
self.__savings = 0.0
# parameters initialization
self._power_threshold = power_threshold
self._resolution = 5
self._energy_rate = kwargs['energy_rate']
self._lines = []
# identification
self._id = inverter_id
self._location = location
self._resolution = resolution
# data storing
self._inverter_electric_data = None
self._inverter_environmental_data = None
self._inverter_metadata = None
И многие параметры затем передаются в класс другими методами, и идея заключается в том, чтобы передать эти значения в класс построителя, например:
inverter = InverterBuilder().set_id("some_id").build()
Моя первоначальная идея состояла в том, чтобы добавить предупреждение об устаревании в конструктор, но это заставило бы строителя также выдать предупреждение.
Итак, есть ли способ выдать предупреждение, когда оригинальный конструктор класса вызывается извне класса построителя?
Например, если кто-то делает предупреждение, например:
inverter = Inverter(...)
В качестве дополнительного примечания я использую deprecation
библиотека для пометки методов как устаревших.