Михаил Омельченко | AI&IT
5.28K subscribers
976 photos
192 videos
4 files
713 links
ИИ в работе, разработка, веб. Агенты, автоматизация, инструменты. Веду я, Михаил Омельченко, внешний технический директор по ИИ и ментор.

Менторство, реклама и сотрудничество: djwoms.ru
Telegram - @DJWOMS
YouTube - https://www.youtube.com/c/DjangoSchool
Download Telegram
Атрибут класса и инстанса, различия.


Атрибуты класса и атрибуты инстанса - это две разные концепции в ООП .

Атрибуты класса:
- Атрибуты класса определяются внутри класса и принадлежат самому классу.
- Они объявляются за пределами конструктора init и обычно инициализируются с помощью присваивания значения напрямую классу.
- Атрибуты класса являются общими для всех экземпляров класса и разделяются между всеми объектами, созданными на основе этого класса.
- Их можно использовать как константы или общие данные для всех экземпляров класса.
- Атрибуты класса могут быть доступны как через имя класса, так и через имя любого объекта, созданного на его основе.

Атрибуты инстанса:
- Атрибуты инстанса принадлежат конкретным экземплярам класса.
- Они объявляются и инициализируются внутри конструктора init, и их значение может быть уникальным для каждого объекта.
- Атрибуты инстанса доступны только через объект, созданный на основе класса, и каждый объект имеет свою собственную копию этих атрибутов.
- Изменение атрибутов инстанса объекта не влияет на атрибуты других объектов, созданных на основе того же класса.

Пример кода:

class MyClass:
    class_attribute = "Атрибут класса."

    def init(self, instance_attribute):
        self.instance_attribute = instance_attribute  # Атрибут инстанса

# Создание объектов
obj1 = MyClass("Атрибут инстанса 1")
obj2 = MyClass("Атрибут инстанса 2")

# Доступ к атрибутам класса
print(obj1.class_attribute)  # Вывод: Атрибут класса.
print(obj2.class_attribute)  # Вывод: Атрибут класса.

# Доступ к атрибутам инстанса
print(obj1.instance_attribute)  # Вывод: Атрибут инстанса 1
print(obj2.instance_attribute)  # Вывод: Атрибут инстанса 2

# Изменение атрибута класса
MyClass.class_attribute = "Обновил атрибут класса"

# Изменение атрибута инстанса
obj1.instance_attribute = "Обновил атрибут инстанса 1"

# Проверка изменений в атрибутах
print(obj1.class_attribute)  # Вывод: Обновил атрибут класса
print(obj2.class_attribute)  # Вывод: Обновил атрибут класса
print(obj1.instance_attribute)  # Вывод: Обновил атрибут инстанса 1
print(obj2.instance_attribute)  # Вывод: Атрибут инстанса 2
👍12🔥4
Вот ещё одна встреча
👍17🤝1
Media is too big
VIEW IN TELEGRAM
Работа с Dockerfile | Проект GSpot

DevOps объясняет для чего нужен Dockerfile. Как работать с Dockerfile.
Какие команды за что отвечают в dockerfile.

Спасибо всем кто помогает в создании данного проекта.

YouTube
VK

🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS
👍8🔥4
Паттерн Хранитель: Как сохранить и восстановить состояние объекта?

Всем привет.
Давайте кратко познакомимся с паттерном Хранитель. Этот паттерн, хотя и звучит немного сложно, в действительности предоставляет нам простой способ сохранить и восстановить состояние объекта.

Для начала представьте, что у вас есть объект, с которым вы работаете и вы хотите сохранить его текущее состояние, чтобы в будущем можно было вернуться к этому состоянию. Вот где на помощь приходит паттерн Хранитель.

Паттерн Хранитель основан на разделении ответственности между объектами. Вместо того, чтобы хранить всю информацию о состоянии объекта в самом объекте, мы создаем дополнительный объект, называемый хранителем, который будет отвечать за сохранение и восстановление состояния.

Давайте рассмотрим пример простой записной книжки. У нас есть объект "Запись", у которого есть название и текст. С помощью паттерна Хранитель мы можем сохранить текущее состояние записи, создавая хранитель, который будет хранить эту информацию. При необходимости мы сможем восстановить запись в исходное состояние.

Плюсы использования паттерна Хранитель:
- Позволяет сохранять состояние объекта и восстанавливать его в нужный момент.
- Разделяет ответственность между объектом и хранителем, что помогает улучшить структуру кода.
- Предоставляет гибкость в управлении состоянием объекта.

Участники процесса:
Memento («хранитель»)
– хранитель, сохраняет состояние объекта Originator;
Originator («создатель») – создает экземпляр объекта хранителя. Имеет полный доступ к Memento;
Caretaker («опекун») – производит сохранения состояний.

Для большего понимания давайте представим пример из реальной жизни. Представьте, что ваше состояние здоровья - это объект и вы хотите сохранить свое текущее состояние на случай, если в будущем заболеете. Вы создаете запись о своем состоянии, которую можно восстановить, когда это потребуется.
🔥10👍4❤1🤔1
Media is too big
VIEW IN TELEGRAM
Как реализовать свой OAuth сервис в Django Rest | Проект GSpot

Разработали собственный пакет для JWT. Своя аутентификация.
Аутентификация в микросервисах.
Как происходит общение между сервисами users и channels посредствам rabbitmq.
Как происходит общение между сервисами users и payments.
Тесты.

Спасибо всем кто помогает в создании данного проекта.

YouTube
VK
Boosty

🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS

#django #gspot #djangorestframework
🔥15
Паттерн Цепочка обязанностей: Передайте ответственность дальше!

Всем привет!
Этот паттерн предоставляет нам простой способ организовать процесс обработки запросов и передать ответственность между объектами.

Представьте, что у нас есть последовательность объектов, каждый из которых может обработать определенный запрос. Однако мы не знаем заранее, какой объект сможет успешно обработать запрос. Также возможны ситуации, когда необходимо передать запрос дальше, если текущий объект не может его обработать.

И вот на помощь приходит паттерн Цепочка обязанностей! По сути, этот паттерн устанавливает связь между объектами в виде цепочки, где каждый объект может принять решение о том, обрабатывать ли запрос самостоятельно или передать его следующему объекту в цепочке.

Вот как это работает:
- У нас есть объекты, называемые обработчиками, которые связаны в цепочку.
- Каждый обработчик имеет определенные условия, при которых он может обработать запрос или передать его следующему обработчику.
- Если текущий обработчик может обработать запрос, он это делает. Если нет, то передает запрос следующему обработчику в цепочке.
- Цепочка продолжается до тех пор, пока запрос не будет обработан или не достигнет конца цепочки.
- Это позволяет гибко настраивать обработку запросов, добавлять или изменять обработчики без изменения кода клиента.

Участники
- Handler: определяет интерфейс для обработки запроса. Также может определять ссылку на следующий обработчик запроса
- ConcreteHandler1 и ConcreteHandler2: конкретные обработчики, которые реализуют функционал для обработки запроса. При невозможности обработки и наличия ссылки на следующий обработчик, передают запрос этому обработчику
В данном случае для простоты примера в качестве параметра передается некоторое число, сначала обработчик обрабатывает запрос и, если передано соответствующее число, завершает его обработку. Иначе передает запрос на обработку следующем в цепи обработчику при его наличии.
- Client: отправляет запрос объекту Handler
🔥6
Примеры использования паттерна Цепочка обязанностей могут быть разнообразными: от обработки событий в пользовательском интерфейсе до обработки запросов в веб-приложениях.

Паттерн Цепочка обязанностей позволяет нам разделить ответственность и легко добавлять, изменять или удалять обработчики в цепочке. Это помогает упростить код и сделать его более гибким и расширяемым.

🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS

#паттерн
👍9
Паттерн Команда: Управление действиями в вашем распоряжении!

Всем привет! Сегодня кратко расскажу о паттерне Команда, который поможет вам управлять действиями в вашем программном коде. Паттерн предоставляет нам простой способ упорядочивания и управления командами в наших программах.

Представьте себе ситуацию, когда вам нужно выполнить определенные действия, но вам необходимо контролировать их выполнение и иметь возможность отменить или повторить их. Именно здесь на помощь приходит паттерн Команда!

Паттерн Команда основан на том, что у нас есть отдельные команды, которые инкапсулируют действия и параметры, связанные с выполнением этих действий. Затем у нас есть отдельный объект, называемый инициатором, который использует эти команды для выполнения нужных действий.

Вот как это работает:
- У нас есть различные команды, представленные отдельными классами, каждый со своей логикой выполнения.
- Эти команды имеют методы выполнения (execute), отмены (undo) и возможно повторения (redo).
- Объекты инициатора (invoker) содержат ссылку на конкретные команды и могут вызывать их методы выполнения, отмены и повторения.
- Таким образом, у нас есть возможность управлять действиями, выполнять их, отменять и повторять по необходимости.

Участники
- Command:
интерфейс, представляющий команду. Обычно определяет метод Execute() для выполнения действия, а также нередко включает метод Undo(), реализация которого должна заключаться в отмене действия команды
- ConcreteCommand: конкретная реализация команды, реализует метод Execute(), в котором вызывается определенный метод, определенный в классе Receiver
- Receiver: получатель команды. Определяет действия, которые должны выполняться в результате запроса.
- Invoker: инициатор команды - вызывает команду для выполнения определенного запроса
- Client: клиент - создает команду и устанавливает ее получателя с помощью метода SetCommand()

#паттерн
👍9
👆Примеры использования паттерна Команда могут быть разнообразными: от реализации истории действий в текстовом редакторе до управления устройствами по удаленному управлению.

Паттерн Команда помогает упорядочить и управлять действиями в наших программах. Он позволяет нам иметь гибкость в управлении командами, а также обеспечивает расширяемость и возможность добавления новых команд без изменения самого кода инициатора.


🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.

Пишите - https://t.me/DJWOMS

#паттерн
Привет! Сегодня о паттерне Интерпретатор.

Паттерн Интерпретатор - это способ общения между компьютером и людьми. Представьте себе, что вы общаетесь с носителем другого языка. Вы можете использовать алфавит, чтобы записывать и передавать сообщения, но вам нужно знать правила, как правильно интерпретировать эти символы.

Точно так же и паттерн Интерпретатор работает на компьютере. Он позволяет нам создавать свои собственные языки, чтобы общаться с компьютером. Мы можем создавать правила (такие как грамматика) для этого языка и компьютер будет точно понимать, что мы от него хотим.

Давайте приведем пример! Представьте, что у нас есть программа-интерпретатор для рисования фигур. Мы можем создать команды для рисования кругов, квадратов или треугольников, и компьютер будет знать, как перевести эти команды в графические изображения.

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

Паттерн Интерпретатор - это прекрасный способ создавать свои собственные языки и делать общение с компьютером более естественным и удобным.

Участники

- AbstractExpression:
определяет интерфейс выражения, объявляет метод Interpret()

- TerminalExpression: терминальное выражение, реализует метод Interpret() для терминальных символов грамматики. Для каждого символа грамматики создается свой объект TerminalExpression

- NonterminalExpression: нетерминальное выражение, представляет правило грамматики. Для каждого отдельного правила грамматики создается свой объект NonterminalExpression.

- Context: содержит общую для интерпретатора информацию. Может использоваться объектами терминальных и нетерминальных выражений для сохранения состояния операций и последующего доступа к сохраненному состоянию

- Client: строит предложения языка с данной грамматикой в виде абстрактного синтаксического дерева, узлами которого являются объекты TerminalExpression и NonterminalExpression
👍8
Введение в паттерн Итератор

Паттерн Итератор - это средство управления и перебора элементов в коллекциях объектов. Представьте, что у вас есть коробка с различными предметами и вам нужно последовательно перебрать каждый предмет без необходимости знать, каким образом они хранятся внутри.

Точно так же и паттерн Итератор помогает нам обходить элементы в коллекции один за другим, скрывая сложность работы с самой коллекцией. Мы можем просто запросить у итератора следующий элемент и он предоставит его нам, пока все элементы не будут перебраны.

Важно отметить, что использование паттерна Итератор делает код более гибким и упрощает его понимание. Он позволяет работать с различными типами коллекций, такими как списки, множества или словари, не меняя логику самого кода.

Паттерн Итератор - это простой и мощный инструмент, который помогает нам управлять и перебирать элементы в коллекциях.

Он широко используется в программировании и помогает нам эффективно работать с данными и коллекциями.

Участники

- Iterator:
определяет интерфейс для обхода составных объектов.
- Aggregate: определяет интерфейс для создания объекта-итератора.
- ConcreteIterator: конкретная реализация итератора для обхода объекта Aggregate. Для фиксации индекса текущего перебираемого элемента использует целочисленную переменную _current.
- ConcreteAggregate: конкретная реализация Aggregate. Хранит элементы, которые надо будет перебирать.
- Client: использует объект Aggregate и итератор для его обхода.

Когда использовать итераторы?

- Когда необходимо осуществить обход объекта без раскрытия его внутренней структуры.

- Когда имеется набор составных объектов, и надо обеспечить единый интерфейс для их перебора.

- Когда необходимо предоставить несколько альтернативных вариантов перебора одного и того же объекта.


🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.

Пишите - https://t.me/DJWOMS
👍5
Привет! 👋

✨ Паттерн Посредник - это способ организации взаимодействия между различными компонентами или объектами в программе. Он помогает упростить связи между объектами и уменьшить их зависимость друг от друга.

🤔 Как это работает на практике? Допустим, у нас есть несколько объектов или компонентов, которые должны общаться друг с другом. Вместо того, чтобы каждый объект знал о существовании других объектов и взаимодействовал с ними напрямую, мы вводим посредника - центральное звено, которое координирует обмен информацией между ними.

🤝 При использовании паттерна Посредник объекты общаются только с посредником, а не между собой. Когда объект нуждается в информации или хочет выполнить какое-то действие другого объекта, он передает запрос посреднику, который обрабатывает этот запрос и решает, какой объект должен получить информацию или выполнить действие.

💡 Преимущества использования паттерна Посредник:

👉 1
) Уменьшение зависимостей между объектами, что делает программу более гибкой и легкой для изменений.
👉 2) Упрощение коммуникации и управления между объектами.
👉 3) Пере используемость компонентов, так как они могут быть легко заменены или добавлены новые объекты без влияния на другие.

🚀 Следует помнить, что паттерн Посредник - это лишь один из многих инструментов в арсенале разработчиков и его использование зависит от конкретной ситуации.

Участники
- Mediator:
представляет интерфейс для взаимодействия с объектами Colleague.
- Colleague: представляет интерфейс для взаимодействия с объектом Mediator.
- ConcreteColleague: конкретные классы коллег, которые обмениваются друг с другом через объект Mediator.
- ConcreteMediator: конкретный посредник, реализующий интерфейс типа Mediator.


🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS

#IT #программирование #паттерны
👍8