Атрибут класса и инстанса, различия.
Атрибуты класса и атрибуты инстанса - это две разные концепции в ООП .
Атрибуты класса:
- Атрибуты класса определяются внутри класса и принадлежат самому классу.
- Они объявляются за пределами конструктора
- Атрибуты класса являются общими для всех экземпляров класса и разделяются между всеми объектами, созданными на основе этого класса.
- Их можно использовать как константы или общие данные для всех экземпляров класса.
- Атрибуты класса могут быть доступны как через имя класса, так и через имя любого объекта, созданного на его основе.
Атрибуты инстанса:
- Атрибуты инстанса принадлежат конкретным экземплярам класса.
- Они объявляются и инициализируются внутри конструктора
- Атрибуты инстанса доступны только через объект, созданный на основе класса, и каждый объект имеет свою собственную копию этих атрибутов.
- Изменение атрибутов инстанса объекта не влияет на атрибуты других объектов, созданных на основе того же класса.
Пример кода:
Атрибуты класса и атрибуты инстанса - это две разные концепции в ООП .
Атрибуты класса:
- Атрибуты класса определяются внутри класса и принадлежат самому классу.
- Они объявляются за пределами конструктора
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
Media is too big
VIEW IN TELEGRAM
Работа с Dockerfile | Проект GSpot
DevOps объясняет для чего нужен Dockerfile. Как работать с Dockerfile.
Какие команды за что отвечают в dockerfile.
Спасибо всем кто помогает в создании данного проекта.
YouTube
VK
🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS
DevOps объясняет для чего нужен Dockerfile. Как работать с Dockerfile.
Какие команды за что отвечают в dockerfile.
Спасибо всем кто помогает в создании данного проекта.
YouTube
VK
🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS
👍8🔥4
Какие элементы входят в паттерн Фасад?
Anonymous Quiz
11%
Слой доступа к данным, модель представления и контроллер.
73%
Фасадный класс, которые предоставляет интерфейс и сложная подсистема, с которой он взаимодействует.
12%
Шаблонный метод, стратегия и декоратор.
4%
Конструктор, наследование и перегрузка операторов
Паттерн Хранитель: Как сохранить и восстановить состояние объекта?
Всем привет.
Давайте кратко познакомимся с паттерном Хранитель. Этот паттерн, хотя и звучит немного сложно, в действительности предоставляет нам простой способ сохранить и восстановить состояние объекта.
Для начала представьте, что у вас есть объект, с которым вы работаете и вы хотите сохранить его текущее состояние, чтобы в будущем можно было вернуться к этому состоянию. Вот где на помощь приходит паттерн Хранитель.
Паттерн Хранитель основан на разделении ответственности между объектами. Вместо того, чтобы хранить всю информацию о состоянии объекта в самом объекте, мы создаем дополнительный объект, называемый хранителем, который будет отвечать за сохранение и восстановление состояния.
Давайте рассмотрим пример простой записной книжки. У нас есть объект "Запись", у которого есть название и текст. С помощью паттерна Хранитель мы можем сохранить текущее состояние записи, создавая хранитель, который будет хранить эту информацию. При необходимости мы сможем восстановить запись в исходное состояние.
Плюсы использования паттерна Хранитель:
- Позволяет сохранять состояние объекта и восстанавливать его в нужный момент.
- Разделяет ответственность между объектом и хранителем, что помогает улучшить структуру кода.
- Предоставляет гибкость в управлении состоянием объекта.
Участники процесса:
Memento («хранитель») – хранитель, сохраняет состояние объекта Originator;
Originator («создатель») – создает экземпляр объекта хранителя. Имеет полный доступ к Memento;
Caretaker («опекун») – производит сохранения состояний.
Для большего понимания давайте представим пример из реальной жизни. Представьте, что ваше состояние здоровья - это объект и вы хотите сохранить свое текущее состояние на случай, если в будущем заболеете. Вы создаете запись о своем состоянии, которую можно восстановить, когда это потребуется.
Всем привет.
Давайте кратко познакомимся с паттерном Хранитель. Этот паттерн, хотя и звучит немного сложно, в действительности предоставляет нам простой способ сохранить и восстановить состояние объекта.
Для начала представьте, что у вас есть объект, с которым вы работаете и вы хотите сохранить его текущее состояние, чтобы в будущем можно было вернуться к этому состоянию. Вот где на помощь приходит паттерн Хранитель.
Паттерн Хранитель основан на разделении ответственности между объектами. Вместо того, чтобы хранить всю информацию о состоянии объекта в самом объекте, мы создаем дополнительный объект, называемый хранителем, который будет отвечать за сохранение и восстановление состояния.
Давайте рассмотрим пример простой записной книжки. У нас есть объект "Запись", у которого есть название и текст. С помощью паттерна Хранитель мы можем сохранить текущее состояние записи, создавая хранитель, который будет хранить эту информацию. При необходимости мы сможем восстановить запись в исходное состояние.
Плюсы использования паттерна Хранитель:
- Позволяет сохранять состояние объекта и восстанавливать его в нужный момент.
- Разделяет ответственность между объектом и хранителем, что помогает улучшить структуру кода.
- Предоставляет гибкость в управлении состоянием объекта.
Участники процесса:
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
Разработали собственный пакет для 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
Всем привет!
Этот паттерн предоставляет нам простой способ организовать процесс обработки запросов и передать ответственность между объектами.
Представьте, что у нас есть последовательность объектов, каждый из которых может обработать определенный запрос. Однако мы не знаем заранее, какой объект сможет успешно обработать запрос. Также возможны ситуации, когда необходимо передать запрос дальше, если текущий объект не может его обработать.
И вот на помощь приходит паттерн Цепочка обязанностей! По сути, этот паттерн устанавливает связь между объектами в виде цепочки, где каждый объект может принять решение о том, обрабатывать ли запрос самостоятельно или передать его следующему объекту в цепочке.
Вот как это работает:
- У нас есть объекты, называемые обработчиками, которые связаны в цепочку.
- Каждый обработчик имеет определенные условия, при которых он может обработать запрос или передать его следующему обработчику.
- Если текущий обработчик может обработать запрос, он это делает. Если нет, то передает запрос следующему обработчику в цепочке.
- Цепочка продолжается до тех пор, пока запрос не будет обработан или не достигнет конца цепочки.
- Это позволяет гибко настраивать обработку запросов, добавлять или изменять обработчики без изменения кода клиента.
Участники
- Handler: определяет интерфейс для обработки запроса. Также может определять ссылку на следующий обработчик запроса
- ConcreteHandler1 и ConcreteHandler2: конкретные обработчики, которые реализуют функционал для обработки запроса. При невозможности обработки и наличия ссылки на следующий обработчик, передают запрос этому обработчику
В данном случае для простоты примера в качестве параметра передается некоторое число, сначала обработчик обрабатывает запрос и, если передано соответствующее число, завершает его обработку. Иначе передает запрос на обработку следующем в цепи обработчику при его наличии.
- Client: отправляет запрос объекту Handler
🔥6
Примеры использования паттерна Цепочка обязанностей могут быть разнообразными: от обработки событий в пользовательском интерфейсе до обработки запросов в веб-приложениях.
Паттерн Цепочка обязанностей позволяет нам разделить ответственность и легко добавлять, изменять или удалять обработчики в цепочке. Это помогает упростить код и сделать его более гибким и расширяемым.
🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS
#паттерн
Паттерн Цепочка обязанностей позволяет нам разделить ответственность и легко добавлять, изменять или удалять обработчики в цепочке. Это помогает упростить код и сделать его более гибким и расширяемым.
🔥Провожу индивидуальные занятия по python и веб разработке (django, fastapi, flask, javascript).
Обучаю с нуля, а так же провожу консультации для мидлов и синьоров.
Пишите - https://t.me/DJWOMS
#паттерн
Telegram
Михаил Омельченко
Основатель DXDocs.ru и AISferaic.ru. 20 лет в IT. Менторство.
👍9
Паттерн Команда: Управление действиями в вашем распоряжении!
Всем привет! Сегодня кратко расскажу о паттерне Команда, который поможет вам управлять действиями в вашем программном коде. Паттерн предоставляет нам простой способ упорядочивания и управления командами в наших программах.
Представьте себе ситуацию, когда вам нужно выполнить определенные действия, но вам необходимо контролировать их выполнение и иметь возможность отменить или повторить их. Именно здесь на помощь приходит паттерн Команда!
Паттерн Команда основан на том, что у нас есть отдельные команды, которые инкапсулируют действия и параметры, связанные с выполнением этих действий. Затем у нас есть отдельный объект, называемый инициатором, который использует эти команды для выполнения нужных действий.
Вот как это работает:
- У нас есть различные команды, представленные отдельными классами, каждый со своей логикой выполнения.
- Эти команды имеют методы выполнения (execute), отмены (undo) и возможно повторения (redo).
- Объекты инициатора (invoker) содержат ссылку на конкретные команды и могут вызывать их методы выполнения, отмены и повторения.
- Таким образом, у нас есть возможность управлять действиями, выполнять их, отменять и повторять по необходимости.
Участники
- Command: интерфейс, представляющий команду. Обычно определяет метод Execute() для выполнения действия, а также нередко включает метод Undo(), реализация которого должна заключаться в отмене действия команды
- ConcreteCommand: конкретная реализация команды, реализует метод Execute(), в котором вызывается определенный метод, определенный в классе Receiver
- Receiver: получатель команды. Определяет действия, которые должны выполняться в результате запроса.
- Invoker: инициатор команды - вызывает команду для выполнения определенного запроса
- Client: клиент - создает команду и устанавливает ее получателя с помощью метода SetCommand()
#паттерн
Всем привет! Сегодня кратко расскажу о паттерне Команда, который поможет вам управлять действиями в вашем программном коде. Паттерн предоставляет нам простой способ упорядочивания и управления командами в наших программах.
Представьте себе ситуацию, когда вам нужно выполнить определенные действия, но вам необходимо контролировать их выполнение и иметь возможность отменить или повторить их. Именно здесь на помощь приходит паттерн Команда!
Паттерн Команда основан на том, что у нас есть отдельные команды, которые инкапсулируют действия и параметры, связанные с выполнением этих действий. Затем у нас есть отдельный объект, называемый инициатором, который использует эти команды для выполнения нужных действий.
Вот как это работает:
- У нас есть различные команды, представленные отдельными классами, каждый со своей логикой выполнения.
- Эти команды имеют методы выполнения (execute), отмены (undo) и возможно повторения (redo).
- Объекты инициатора (invoker) содержат ссылку на конкретные команды и могут вызывать их методы выполнения, отмены и повторения.
- Таким образом, у нас есть возможность управлять действиями, выполнять их, отменять и повторять по необходимости.
Участники
- Command: интерфейс, представляющий команду. Обычно определяет метод Execute() для выполнения действия, а также нередко включает метод Undo(), реализация которого должна заключаться в отмене действия команды
- ConcreteCommand: конкретная реализация команды, реализует метод Execute(), в котором вызывается определенный метод, определенный в классе Receiver
- Receiver: получатель команды. Определяет действия, которые должны выполняться в результате запроса.
- Invoker: инициатор команды - вызывает команду для выполнения определенного запроса
- Client: клиент - создает команду и устанавливает ее получателя с помощью метода SetCommand()
#паттерн
👍9