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

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

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

39 ответов

25 просмотров

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

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

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

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

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
9
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Карта сайта