Михаил Омельченко | 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