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

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

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

39 ответов

28 просмотров

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

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-Павлик Автор вопроса

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта