был публичный контсруктор без аргументов, но при этом, мне нужно его довольно часто создавать с другими полями во внутреннем коде, то есть должен быть приватный конструктор с арументами.
Как это моно нормально реализовать?
Классметодом наверное? Но пардон мб не так понял
Klass._from_parts(args) -> Klass
Он все равно должен дергать публичный конструктор
Я не хочу делать так, чтобы этот конструктор вызывал конструктор без аругментов
А это проблема создать и поменять атрибуты и вернуть инстанс?
Вот тут сорян не улавливаю
В том, что это оверхед, а делаться это все будет очень часто
Ну если по коду - то получится вполне эксплицитный понятный оверхед, если по ресурсам - думаю наврядли
def __init__(do_init=True): if do_init: ... internal_obj = Klass(False) # some bontrivial init
Что значит эксплицитный понятный оверхед по коду?
Выглядит как говно конечно, но я не знаю способа лучше
Наружу выставить протокол и функцию создания экземпляра подходящего приватного класса
А почему инит без аргументов тяжелый?
Он не тяжелый, он очень много раз будет вызываться
Дело в том, что мне бы хотелось, чтобы публично этот класс можно было конструировать. Можно, конечно, выставить фабрику...
Ну я и говорю, выставить фабрику, а не класс
Я нашел, как это сделать нормально. class Bar: @classmethod def bar(cls): return super().__new__(cls)
А инит?
В примере его нет, но его легко прикрутить
И где тут приватный с параметрами?
Мне лень было писать полностью. Я показал, как обойти вызов инит и нью в классметоде
Я видимо туплю и не понимаю, где тут приватный конструктор. Вижу два публичных
Вот реальный код class SearchState: def __init__(self): self._offset = 0 @classmethod def _create(cls, offset: int): obj = super().__new__(cls) obj._offset = offset return obj @abstractmethod def start_from_next(self) -> 'SearchState': return self._create(self._offset + 1)
Ну, на вызов _create вне класса будет любой линтер ругаться
Че б не сделать параметр offset в ините со значением по умолчанию, равным нолю?
Пусть ругается. Им должны пользоваться те, кто не боится лезть во внутренности
Чтобы его снаружи нельзя было сменить
зачем вам в питоне прямо *приватные* конструкторы? Оставьте доку как пользоваться вашим кодом и обычный инит и не обычный в виде классметода
У тебя дублируется код инициализации в итоге
В каком месте?
3 и 8 строки, сохраняют значения в атрибут. Если класс станет побольше, ты за такими штуками в разных местах не уследишь.
ну, так это разный код для разных конструкторов
Представь, у тебя был бы инит на 10 строк, а различались бы в 2 разных конструкторах 1 или 2 из них
Ну, так смысл в том, что там будет совсем разный код
Хз, мне больше нравится идея с фабрикой
А если он будет не совсем разный?
Зачем там супер?
Чтобы объект создать
Ты уже третий, кто спрашивает, кек
Обсуждают сегодня