170 похожих чатов

У меня ессть публичный класс. Я хочу, чтобы у него

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

39 ответов

10 просмотров

Классметодом наверное? Но пардон мб не так понял

Klass._from_parts(args) -> Klass

Pavel-Павлик Автор вопроса

Он все равно должен дергать публичный конструктор

Pavel-Павлик Автор вопроса

Я не хочу делать так, чтобы этот конструктор вызывал конструктор без аругментов

А это проблема создать и поменять атрибуты и вернуть инстанс?

Вот тут сорян не улавливаю

Pavel-Павлик Автор вопроса

В том, что это оверхед, а делаться это все будет очень часто

Ну если по коду - то получится вполне эксплицитный понятный оверхед, если по ресурсам - думаю наврядли

def __init__(do_init=True): if do_init: ... internal_obj = Klass(False) # some bontrivial init

Pavel-Павлик Автор вопроса

Что значит эксплицитный понятный оверхед по коду?

Выглядит как говно конечно, но я не знаю способа лучше

Наружу выставить протокол и функцию создания экземпляра подходящего приватного класса

А почему инит без аргументов тяжелый?

Pavel-Павлик Автор вопроса

Он не тяжелый, он очень много раз будет вызываться

Pavel-Павлик Автор вопроса

Дело в том, что мне бы хотелось, чтобы публично этот класс можно было конструировать. Можно, конечно, выставить фабрику...

Ну я и говорю, выставить фабрику, а не класс

Pavel-Павлик Автор вопроса

Я нашел, как это сделать нормально. class Bar: @classmethod def bar(cls): return super().__new__(cls)

А инит?

Pavel-Павлик Автор вопроса

В примере его нет, но его легко прикрутить

И где тут приватный с параметрами?

Pavel-Павлик Автор вопроса

Мне лень было писать полностью. Я показал, как обойти вызов инит и нью в классметоде

Я видимо туплю и не понимаю, где тут приватный конструктор. Вижу два публичных

Pavel-Павлик Автор вопроса

Вот реальный код 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 в ините со значением по умолчанию, равным нолю?

Pavel-Павлик Автор вопроса

Пусть ругается. Им должны пользоваться те, кто не боится лезть во внутренности

Pavel-Павлик Автор вопроса

Чтобы его снаружи нельзя было сменить

зачем вам в питоне прямо *приватные* конструкторы? Оставьте доку как пользоваться вашим кодом и обычный инит и не обычный в виде классметода

У тебя дублируется код инициализации в итоге

Pavel-Павлик Автор вопроса

В каком месте?

3 и 8 строки, сохраняют значения в атрибут. Если класс станет побольше, ты за такими штуками в разных местах не уследишь.

Pavel-Павлик Автор вопроса

ну, так это разный код для разных конструкторов

Представь, у тебя был бы инит на 10 строк, а различались бы в 2 разных конструкторах 1 или 2 из них

Pavel-Павлик Автор вопроса

Ну, так смысл в том, что там будет совсем разный код

Хз, мне больше нравится идея с фабрикой

А если он будет не совсем разный?

Зачем там супер?

Pavel-Павлик Автор вопроса

Чтобы объект создать

Ты уже третий, кто спрашивает, кек

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Утра доброго. Просветите пожалуйста. Хочу сделать rest сервер на делфи. Посмотрел 3 фреймворка: dmvc, Mars, mormot. Ни в одном из них не упоминается ассинхронная обработка вхо...
Сергей Бычков
10
возможно для форматирования TimeStampZ нужен другой механизм, не?
Роман Лях (rgreat)
13
Карта сайта