В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования:
Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных.
Создается базовый класс с
abstract = True
в Meta
.Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
from django.db import models
class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True # Указывает, что это абстрактная модель
class Post(BaseModel):
title = models.CharField(max_length=255)
content = models.TextField()
class Comment(BaseModel):
text = models.TextField()
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает
OneToOneField
на родительскую.class Person(models.Model):
name = models.CharField(max_length=255)
class Employee(Person): # Отдельная таблица employee
salary = models.DecimalField(max_digits=10, decimal_places=2)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В
Meta
указывается proxy = True
.Можно переопределять методы, добавлять новые, но не менять поля.
class Person(models.Model):
name = models.CharField(max_length=255)
class Manager(Person):
class Meta:
proxy = True # Указываем, что это прокси-модель
def get_uppercase_name(self):
return self.name.upper()
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
- Имеет атрибуты и методы.
- Представляет сущность с данными и поведением.
- В Python всё является объектом, включая числа и строки.
2. Необъект:
- Это концепция из других языков, где примитивные типы данных (например, int, float) не имеют методов и атрибутов.
- Таких необъектов нет.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
Ищу работу пол года
Практически под каждым постом в этом канале я вижу комментарии от людей, которые ищут работу по полгода. Это перерастает в обсуждение того, как нужно (или не нужно) искать работу, почему процесс найма сломан и как они откликались на фейковые вакансии.
Честно говоря, искать работу полгода — это нонсенс. Очевидно, что человек делает что-то не так. Главная ошибка, которую совершают многие, — это создание иллюзии поиска работы.
То есть человек вроде бы ищет работу, но делает это неэффективно, тратя время на нецелевые действия. Например:
➖ Просматривает вакансии перед откликом.
➖ Пытается понять, подходит ли он под вакансию. Если считает, что не подходит — не откликается.
➖ Пишет сопроводительные письма (иногда даже уникальные под каждую вакансию).
➖ Заполняет анкеты, проходит тесты.
Все эти действия отнимают время, но не приводят к результату.
Почему это не работает?
HR-менеджер не может вручную отсмотреть 2000 откликов, оценить каждое резюме и прочитать сопроводительные письма. Поэтому компании используют ATS-системы (системы автоматического подбора), которые анализируют резюме и определяют процент его соответствия вакансии.
Что делать, чтобы повысить шансы?
1️⃣ Добавить ключевые навыки в резюме — и в основной текст, и в теги. Возьмите их с easyoffer.ru
2️⃣ Убрать нерелевантный опыт, оставить только подходящий.
3️⃣ Оформить опыт так, чтобы он выглядел релевантным. Если у вас его нет, укажите проекты, стажировки или другой опыт, который можно представить как работу от 1 года. Если опыт слишком большой, сузьте его до 6 лет.
4️⃣ Откликаться на все вакансии без разбору. Если вы Junior, не ищите только стажер или Junior-вакансии — пробуйте везде. Не отказывайте себе сами, пусть это решит HR
5️⃣ Сделать резюме публичным, потому что HR-менеджеры часто ищут кандидатов не только среди откликов, но и в базе резюме.
6️⃣ Используйте ИИ по минимуму – ATS-системы считывают это и помечают "сгенерировано ИИ"
‼️ Главное правило: чем больше откликов — тем выше шанс получить оффер. Делайте резюме удобным для ATS-систем, и вас заметят.
1. Посмотрите видео о том как я вывел свою резюме в Топ1 на HH
2. Посмотрите видео как я нашел первую работу
3. Прочитайте этот кейс про оптимизацию резюме
Если прям вообще тяжело.
Создайте несколько разных резюме. Создайте 2, 3 да хоть 10 резюме. Настройте авто-отлики и ждите приглашения на собесы.
Не нужно создавать иллюзию поиска работы, сделайте несколько простых и актуальных действий.
Практически под каждым постом в этом канале я вижу комментарии от людей, которые ищут работу по полгода. Это перерастает в обсуждение того, как нужно (или не нужно) искать работу, почему процесс найма сломан и как они откликались на фейковые вакансии.
Честно говоря, искать работу полгода — это нонсенс. Очевидно, что человек делает что-то не так. Главная ошибка, которую совершают многие, — это создание иллюзии поиска работы.
То есть человек вроде бы ищет работу, но делает это неэффективно, тратя время на нецелевые действия. Например:
Все эти действия отнимают время, но не приводят к результату.
Почему это не работает?
HR-менеджер не может вручную отсмотреть 2000 откликов, оценить каждое резюме и прочитать сопроводительные письма. Поэтому компании используют ATS-системы (системы автоматического подбора), которые анализируют резюме и определяют процент его соответствия вакансии.
Что делать, чтобы повысить шансы?
1️⃣ Добавить ключевые навыки в резюме — и в основной текст, и в теги. Возьмите их с easyoffer.ru
2️⃣ Убрать нерелевантный опыт, оставить только подходящий.
3️⃣ Оформить опыт так, чтобы он выглядел релевантным. Если у вас его нет, укажите проекты, стажировки или другой опыт, который можно представить как работу от 1 года. Если опыт слишком большой, сузьте его до 6 лет.
4️⃣ Откликаться на все вакансии без разбору. Если вы Junior, не ищите только стажер или Junior-вакансии — пробуйте везде. Не отказывайте себе сами, пусть это решит HR
5️⃣ Сделать резюме публичным, потому что HR-менеджеры часто ищут кандидатов не только среди откликов, но и в базе резюме.
6️⃣ Используйте ИИ по минимуму – ATS-системы считывают это и помечают "сгенерировано ИИ"
‼️ Главное правило: чем больше откликов — тем выше шанс получить оффер. Делайте резюме удобным для ATS-систем, и вас заметят.
1. Посмотрите видео о том как я вывел свою резюме в Топ1 на HH
2. Посмотрите видео как я нашел первую работу
3. Прочитайте этот кейс про оптимизацию резюме
Если прям вообще тяжело.
Создайте несколько разных резюме. Создайте 2, 3 да хоть 10 резюме. Настройте авто-отлики и ждите приглашения на собесы.
Не нужно создавать иллюзию поиска работы, сделайте несколько простых и актуальных действий.
Please open Telegram to view this post
VIEW IN TELEGRAM
Это такие типы данных, которые имеют постоянное (неизменяемое) хеш-значение на протяжении всего времени их существования. Это означает, что их можно использовать в качестве ключей в словарях (
dict
) и элементов в множествах (set
), так как они поддерживают вычисление хеша с помощью функции hash()
.если объект можно изменить после создания, его хеш тоже изменится, что нарушает работу структур данных (словари, множества).
который возвращает уникальный идентификатор объекта.
Числа (
int
, float
, complex
)print(hash(42)) # 42
print(hash(3.14)) # 322818021289917443
print(hash(1 + 2j)) # 8389048192121911274
Строки (
str
)print(hash("hello")) # Например, 5320385861927423548
Кортежи (
tuple
), если все их элементы тоже хешируемые:print(hash((1, 2, 3))) # 529344067295497451
Булевы значения (
bool
):print(hash(True)) # 1
print(hash(False)) # 0
Списки (
list
)hash([1, 2, 3]) # TypeError: unhashable type: 'list'
Множества (
set
)hash({1, 2, 3}) # TypeError: unhashable type: 'set'
Словари (
dict
)hash({"a": 1}) # TypeError: unhashable type: 'dict'
Хешируемые типы используются в словари (
dict
) и множества (set
), так как они используют хеш-функцию для быстрого поиска данных.my_dict = { (1, 2, 3): "tuple_key" } # Работает, потому что кортеж неизменяемый
my_set = { 42, "hello", (1, 2) } # Все элементы хешируемые
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2. Контроль доступа: использование модификаторов доступа (public, protected, private) для определения видимости.
3. Абстрагирование логики: наружу предоставляется только необходимый функционал, скрывая сложность реализации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это методология управления процессом создания программного обеспечения, которая включает в себя последовательность этапов и действий, необходимых для разработки, тестирования, развертывания и поддержки программных продуктов. Цель SDLC — обеспечить структурированный и эффективный подход к разработке ПО, минимизируя риски и повышая качество конечного продукта.
На этом этапе определяются цели проекта, анализируются потребности и требования к системе. Включает сбор требований от заинтересованных сторон, анализ бизнес-процессов и создание документации с описанием требований.
Встречи с клиентами и пользователями для определения функций системы. Документирование функциональных и нефункциональных требований.
На этапе проектирования разрабатывается архитектура системы и ее компоненты. Создаются технические спецификации, включая схемы базы данных, диаграммы классов и интерфейсов, а также детализируется план реализации.Разработка диаграмм UML.Создание прототипов пользовательского интерфейса.Проектирование архитектуры системы.
На этом этапе осуществляется непосредственная разработка программного обеспечения на основе спецификаций, созданных на предыдущем этапе. Кодирование выполняется в соответствии с выбранными языками программирования и инструментами разработки. Написание кода для модулей и компонентов системы. Интеграция различных компонентов системы. Регулярное использование систем контроля версий (например, Git).
Этап тестирования включает проверку и валидацию системы для обнаружения и исправления ошибок. Тестирование проводится в различных формах, включая юнит-тестирование, интеграционное тестирование, системное тестирование и приемочное тестирование. Автоматизированное тестирование с использованием фреймворков, таких как pytest или JUnit. Ручное тестирование функциональности и пользовательского интерфейса. Тестирование производительности и безопасности.
На этом этапе программное обеспечение разворачивается в рабочей среде и становится доступным пользователям. Включает настройку серверов, развертывание баз данных и настройку инфраструктуры. Развертывание на облачных платформах, таких как AWS или Azure. Настройка и конфигурация серверов и сетей. Миграция данных и начальная загрузка данных.
Этап поддержки и сопровождения включает в себя обслуживание и улучшение системы после ее развертывания. Включает исправление ошибок, обновление функциональности и оптимизацию производительности. Обновление системы безопасности. Внесение изменений на основе отзывов пользователей. Обслуживание серверов и баз данных.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Метод new используется для создания экземпляра класса, а singleton гарантирует, что будет создан только один экземпляр.
2. Singleton можно реализовать, переопределяя new, чтобы возвращать уже существующий объект, если он был создан ранее.
3. Таким образом, new служит инструментом для контроля экземпляров в паттерне Singleton.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В Python этот метод называется
__del__()
. Деструктор используется для выполнения операций очистки, таких как освобождение ресурсов или выполнение завершающих действий перед тем, как объект будет удален из памяти.Определяется внутри класса с помощью метода
__del__()
. class FileManager:
def __init__(self, filename):
self.file = open(filename, 'w')
print(f"Файл {filename} открыт для записи.")
def write_data(self, data):
self.file.write(data)
def __del__(self):
self.file.close()
print("Файл закрыт.")
FileManager
имеет конструктор __init__()
, который открывает файл для записи.write_data()
записывает данные в файл.__del__()
закрывает файл, когда объект FileManager
уничтожается.Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
manager = FileManager('example.txt')
manager.write_data('Hello, world!')
# Когда объект manager больше не нужен, вызывается деструктор и файл закрывается
Python использует механизм сборки мусора для автоматического управления памятью. Когда объект больше не используется (например, нет активных ссылок на него), сборщик мусора удаляет объект и вызывает его деструктор.
Точное время вызова деструктора зависит от работы сборщика мусора. Это означает, что нельзя гарантировать момент вызова деструктора. Поэтому для критических операций лучше использовать явное управление ресурсами, например, с помощью контекстных менеджеров (
with
).Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Файл автоматически закрывается после выхода из блока with
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Атрибут slots ограничивает набор свойств, которые можно добавлять объекту, улучшая использование памяти.
2. Убирает динамический словарь атрибутов (dict), что снижает накладные расходы.
3. Подходит для классов с большим количеством объектов, где оптимизация памяти критична.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать предыдущее состояние объекта без нарушения инкапсуляции. Этот паттерн особенно полезен для реализации операций отмены и повтора, так как он позволяет хранить состояния объектов и возвращать их к этим состояниям по необходимости.
Позволяет сохранять текущее состояние объекта и восстанавливать его позже.
Обеспечивает сохранение состояния объекта без нарушения его инкапсуляции. Внутренние детали объекта остаются скрытыми от других объектов.
Поддерживает функциональность отмены и повтора операций, так как позволяет возвращать объект к предыдущим состояниям.
Пример реализации
class Memento:
def __init__(self, state: str):
self._state = state
def get_state(self) -> str:
return self._state
class TextEditor:
def __init__(self):
self._state = ""
self._history = []
def type(self, text: str):
self._save_state()
self._state += text
def _save_state(self):
self._history.append(Memento(self._state))
def undo(self):
if not self._history:
return
memento = self._history.pop()
self._state = memento.get_state()
def get_content(self) -> str:
return self._state
# Клиентский код для использования паттерна Хранитель
def main():
editor = TextEditor()
editor.type("Hello, ")
editor.type("world!")
print(editor.get_content()) # Hello, world!
editor.undo()
print(editor.get_content()) # Hello,
editor.undo()
print(editor.get_content()) #
if __name__ == "__main__":
main()
Сохраняет состояние объекта. Он предоставляет методы для получения сохраненного состояния, но не предоставляет методов для изменения состояния, что обеспечивает неизменность.
Создает и использует объекты
Memento
для сохранения и восстановления своего состояния. Методы type
и undo
позволяют редактировать текст и отменять изменения.Сохраняет текущее состояние редактора в истории перед каждым изменением.
Восстанавливает предыдущее состояние редактора из истории.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Проблема алмаза наследования: порядок вызовов методов становится неоднозначным, если класс наследует от двух классов, имеющих общий предок.
2. Решает это через алгоритм MRO (Method Resolution Order), но это может усложнить проектирование.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Dunder (double underscore) методы предоставляют интерфейсы для встроенных операций, таких как арифметика, сравнение, представление объекта.
2. Например, str для строкового представления, add для перегрузки оператора +.
3. Они делают классы более гибкими и интегрируемыми с Python-экосистемой.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
2. Если экземпляр уже создан, возвращать сохранённый объект, а не создавать новый.
3. Это позволяет гарантировать, что все обращения к классу используют один и тот же экземпляр.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
ТОП 2 канала для тех кто увлекатеся хакингом и кибербезопасностью:
Этичный Хакер — крупнейший в СНГ канал по информационной безопасности. OSINT, анонимность, пентест, социальная инженерия.
Лаборатория Хакера — авторский канал от специалиста по ИБ. Новости даркнета, сетевая разведка, обзоры инструментов с github, полезные подборки.
Этичный Хакер — крупнейший в СНГ канал по информационной безопасности. OSINT, анонимность, пентест, социальная инженерия.
Лаборатория Хакера — авторский канал от специалиста по ИБ. Новости даркнета, сетевая разведка, обзоры инструментов с github, полезные подборки.
Существует несколько видов тестов, каждый из которых имеет свою цель и особенности.
Проверка работы отдельных модулей или функций в изоляции от других частей системы.
Ориентированы на минимальные части кода (функции, методы, классы).
Высокая скорость выполнения.
Простота написания и отладки.
Обычно пишутся разработчиками.
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
def fetch_data_from_api():
response = requests.get('https://api.example.com/data')
return response.json()
def test_fetch_data_from_api():
data = fetch_data_from_api()
assert 'key' in data
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
Измеряют скорость выполнения, пропускную способность и время отклика системы.
Оценивают защищенность системы от угроз и атак.
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1. Инкапсуляция выражена через модификаторы доступа: public, protected и private.
2. Используется соглашение: _ для защищённых и __ для приватных атрибутов.
3. Обеспечивает управление доступом к данным и методам, скрывая детали реализации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Обработка исключений — это механизм в программировании, который позволяет предотвращать аварийное завершение программы, если во время выполнения возникает ошибка. Вместо того чтобы программа просто "упала", обработка исключений дает возможность перехватить ошибку и обработать её безопасным способом.
В реальном коде ошибки неизбежны:
деление на ноль (
ZeroDivisionError
), обращение к несуществующему индексу (
IndexError
), работа с несуществующим файлом (
FileNotFoundError
) и т. д. В Python для обработки исключений используется конструкция try-except.
Обработка деления на ноль
try:
x = 10 / 0 # Ошибка: деление на ноль
except ZeroDivisionError:
print("Ошибка! Деление на ноль невозможно.")
Результат: вместо аварийного завершения программы мы получаем сообщение
Ошибка! Деление на ноль невозможно.
Обработка нескольких типов исключений
try:
num = int(input("Введите число: ")) # Возможна ошибка ValueError
result = 10 / num # Возможна ошибка ZeroDivisionError
except ZeroDivisionError:
print("Ошибка! Деление на ноль.")
except ValueError:
print("Ошибка! Введите число.")
Если пользователь введет "abc", программа не завершится с ошибкой, а выведет
Ошибка! Введите число.
Использование
finally
(код, который выполняется всегда) try:
file = open("data.txt", "r") # Возможна ошибка FileNotFoundError
content = file.read()
except FileNotFoundError:
print("Файл не найден!")
finally:
print("Программа завершена.") # Выполнится в любом случае
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from easyoffer
– Помощь с pet-проектом
– Составление roadmap
– Общая консультация
– Проведение код-ревью и mock-собеседования
– Помощь с трудоустройством
Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.
🔥 Узнай список топовых менторов
✴ Многие из них предлагают бесплатную первую консультацию
– Составление roadmap
– Общая консультация
– Проведение код-ревью и mock-собеседования
– Помощь с трудоустройством
Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.
Please open Telegram to view this post
VIEW IN TELEGRAM
Микросервисная архитектура разделяет приложение на независимые модули, которые взаимодействуют через API, в отличие от монолитной, где весь код и функции объединены в одном приложении. Микросервисы проще масштабировать, обновлять и разворачивать, но их сложнее администрировать из-за множества сервисов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM