Форум сайта python.su
RodegastВот практическая такая штука была на самом начале проектирования. И я от нее отказался по следующей причине: объект класса Server обязан создаваться с _id и form_data. Но для CRUD методов, которые будут вызываться от инстанса, не всегда будут иметь место как form_data так и _id.class Crud_Singleton: orm = .... class BaseData: def __init__(self): self._orm = Crud_Singleton() class Server(BaseData): def __init__(self, _id, form_data): super().__init__() self._id = _id self.form_data = form_data def create(self): self._orm.save(self.form_data) def get_by_id(self): self._orm.get(self._id) def delete(self): self._orm.delete(self._id)
@classmethod create_instance_by_form_data(cls, form_data): return cls(form_data=form_data) create_instance_by_id(cls, id): return cls(id=id)
Офлайн
py.user.next
Это не абстракция. Абстракция - это такая сущность, которая нужна, чтобы выделить основные черты и спрятать детали
Офлайн
bootcdВот смотри, есть абстрактная собака, которую я описывал здесь. У этой абстрактной собаки есть уши. Они какие? Они стоят или висят, они целые или порванные в боях? Вот уши - это абстракция. Собака - это абстракция. У абстрактной собаки есть абстрактные уши. Каким образом эти уши прикреплены к этой собаке? Ну они прикручены или прилеплены, пришиты или растут из неё? Эта прикрепленность - это абстракция. Итак, мы имеет абстрактную собаку, к которой абстрактно прикреплены абстрактные уши. И мы можем описать реализацию этой связки из абстракций через набор конкретных объектов. Из живого добермана растут стоячие уши. К плюшевому щенку неопределённой породы пришиты висячие уши. К железной собаке приварены треугольные уши. В снежную собаку вставлены длинные морковные уши. Вот эти все объекты разные, а описаны все они одной вот этой связкой из трёх абстракций. Каждый объект своей абстракцией описан. Он реализует абстракцию, которая его описывает, выражает её.
“Работа с моделями ОРМ по определенной теме” - это и есть абстракция.
Основные черты - механизмы работы с ОРМ
Детали - определенная тема данных в БД. Например записи о пользователях.
Офлайн
py.user.next
Вот у тебя два человека общаются стоят. Ты что будешь описывать? Абстракцию Человек и ещё одну абстракцию Человек?
class Human: pass class TalkingPerson(Human): def __init__(self, name, role): self.role: str = role self.name: str = name class Talking: def __init__(self, members): self.members: list[TalkingPerson] = members def get_fixation(self): pass def get_info(self): pass class Interview(Talking): def __init__(self, members): super().__init__(members) def get_fixation(self, dictofon_recording_file=None): # record works return dictofon_recording_file def get_info(self): return f"{self.members[0].name} задает вопросы {self.members[1].name} и записывает на диктофон ответы." class VideoPodcast(Talking): def __init__(self, members): super().__init__(members) def get_info(self): return f"{self.members[0].name} ведет подкаст с гостем {self.members[1].name} и записывает видео." def get_fixation(self, videostaff_recording_file=None): # record works return videostaff_recording_file person1 = TalkingPerson('Васян', 'журналист') person2 = TalkingPerson('Толян', 'интервьюируемый') interview = Interview([person1, person2]) interview_file = interview.get_fixation() interview_info = interview.get_info() person3 = TalkingPerson('Иванов', 'подкастер') person4 = TalkingPerson('Зубарев', 'гость') videopodcast = VideoPodcast([person3, person4]) videopodcast_file = videopodcast.get_fixation() videopodcast_info = videopodcast.get_info() print(interview_info) print(videopodcast_info)
Офлайн
> И я от нее отказался по следующей причине
Там объект с данными который может сохранять своё состояние в БД или восстанавливать его. Все норм.
> производим то телевизор без экрана, то без кнопки включения.
Если у объекта поле _id == None, то это означает что ты его в БД не сохранил. Когда вызовешь метод create, тогда _id и появится. Если захочешь то можно сделать статусы у объекта по типу: “удалён”, “сохранён”, “создан” и т.д.
Офлайн
Rodegast
> И я от нее отказался по следующей причинеТам объект с данными который может сохранять своё состояние в БД или восстанавливать его. Все норм.> производим то телевизор без экрана, то без кнопки включения.Если у объекта поле _id == None, то это означает что ты его в БД не сохранил. Когда вызовешь метод create, тогда _id и появится. Если захочешь то можно сделать статусы у объекта по типу: “удалён”, “сохранён”, “создан” и т.д.
Офлайн
> Вот у меня есть условный коллега…
Вот как раз для таких коллег придумали документацию
> Насколько я понял теорию ООП, то как раз для конструктора надо создавать такие условия, когда объект инициализируется одинаково для всех случаев его работы.
Ты удивишься, но у объекта может быть несколько конструкторов каждый под свои условия. Это распространено в java, c# и подобных языках в python-е это сделать сложнее, но всё рано можно. В моём примере _id из конструктора можно вообще удалить и сделать его частью реализации.
Офлайн
Rodegast
> Вот как раз для таких коллег придумали документацию >
Rodegast
Ты удивишься, но у объекта может быть несколько конструкторов каждый под свои условия. Это распространено в java, c# и подобных языках в python-е это сделать сложнее, но всё рано можно. В моём примере _id из конструктора можно вообще удалить и сделать его частью реализации.
Офлайн
bootcdСына несколько лет назад учил ООП на руби, на пайтоне чуть посложнее синтаксис. Через руби зашел в ООП очень легко. Руби для новичков самый простой язык, и он как брат близнец пайтон.
В принципе мне ясны пути решения этого вопроса. Спасибо большое! Тут или расслабиться и кидать None в конструктор, или же городить какой-то огород, до которого я еще не дошел в плане изучения.
Офлайн
> Тут как бы недостатки проектирования мы компенсируем хорошей инструкцией.
Ну вот тебе более элегантный пример:
class ServerData(BaseData): def __init__(self, form_data): super().__init__() self._id = None self.form_data = form_data def create(self): self._id = self._orm.save(self.form_data) def get_by_id(self): self._orm.get(self._id) def delete(self): self._orm.delete(self._id) class ServerBase(ServerData): def __init__(self, _id, form_data): super().__init__(form_data) self._id = _id def read_servers(select_filter): ... return ServerBase(_id, form_data)
Офлайн