Какой подход к параллелизму позволяет выполнение нескольких задач в одном потоке, переключаясь между задачами при ожидании ввода/вывода?
Anonymous Quiz
18%
Multithreading
17%
Multiprocessing
60%
Asynchronous programming
5%
Concurrent programming
❤5👍2
Какой метод используется при инициализации класса ?
Спросят с вероятностью 3%
Метод, используемый при инициализации класса, называется init. Он является конструктором класса и вызывается автоматически при создании нового экземпляра класса. Этот метод позволяет задать начальные значения атрибутов объекта и выполнить любую инициализацию, необходимую для корректной работы объекта.
Зачем он нужен
1️⃣Инициализация атрибутов: Метод init позволяет задать начальные значения для атрибутов объекта. Это важно для того, чтобы объект был полностью готов к использованию сразу после
2️⃣Логика при создании объекта: В init можно включить любую логику, которая должна выполняться при создании объекта. Например, проверку входных данных, настройку соединений или запуск фоновых процессов.
Как его использовать
Метод init определен в классе как функция с первым параметром self, который является ссылкой на экземпляр класса. Это позволяет методу работать с атрибутами объекта.
Пример кода:
В этом примере метод init принимает два параметра, name и age, и инициализирует атрибуты self.name и self.age значениями, переданными при создании объекта person1.
Почему именно так
✅Четкость и читаемость кода: Использование init делает код более читаемым и понятным, поскольку вся инициализация объекта сосредоточена в одном месте.
✅Стандартизация: Это стандартный способ инициализации объектов в Python, что делает код более предсказуемым и упрощает его сопровождение.
Метод init используется для задания начальных значений атрибутов объекта при его создании. Он обеспечивает правильную инициализацию объекта, делая его готовым к использованию.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Метод, используемый при инициализации класса, называется init. Он является конструктором класса и вызывается автоматически при создании нового экземпляра класса. Этот метод позволяет задать начальные значения атрибутов объекта и выполнить любую инициализацию, необходимую для корректной работы объекта.
Зачем он нужен
1️⃣Инициализация атрибутов: Метод init позволяет задать начальные значения для атрибутов объекта. Это важно для того, чтобы объект был полностью готов к использованию сразу после
создания.2️⃣Логика при создании объекта: В init можно включить любую логику, которая должна выполняться при создании объекта. Например, проверку входных данных, настройку соединений или запуск фоновых процессов.
Как его использовать
Метод init определен в классе как функция с первым параметром self, который является ссылкой на экземпляр класса. Это позволяет методу работать с атрибутами объекта.
Пример кода:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# Создание экземпляра класса Person
person1 = Person("Alice", 30)
print(person1.name) # Вывод: Alice
print(person1.age) # Вывод: 30
В этом примере метод init принимает два параметра, name и age, и инициализирует атрибуты self.name и self.age значениями, переданными при создании объекта person1.
Почему именно так
✅Четкость и читаемость кода: Использование init делает код более читаемым и понятным, поскольку вся инициализация объекта сосредоточена в одном месте.
✅Стандартизация: Это стандартный способ инициализации объектов в Python, что делает код более предсказуемым и упрощает его сопровождение.
Метод init используется для задания начальных значений атрибутов объекта при его создании. Он обеспечивает правильную инициализацию объекта, делая его готовым к использованию.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍21
Как называется полиморфизм, который позволяет одному и тому же оператору или функции работать с различными типами данных?
Anonymous Quiz
51%
Параметрический полиморфизм
9%
Ад хок полиморфизм
23%
Оверрайдинг методов
16%
Дактайпинг
🤔26💊4
Можно ли в Python реализовать интерфейс ?
Спросят с вероятностью 3%
Нет встроенной концепции интерфейсов. Однако интерфейсы можно реализовать с помощью абстрактных базовых классов (Abstract Base Classes, ABCs), предоставляемых модулем
Зачем они нужны
1️⃣Обеспечение согласованности: Позволяют задать набор методов, которые должны быть реализованы в классах, гарантирующих, что эти классы будут иметь определенные методы.
2️⃣Полиморфизм: Позволяют работать с объектами различных классов через единый интерфейс, не зная их конкретные типы.
3️⃣Стандартизация кода: Помогают стандартизировать код, что делает его более читаемым и поддерживаемым.
Как реализовать интерфейс с помощью ABC
1️⃣Создание абстрактного базового класса: Используйте модуль
2️⃣Определение абстрактных методов: Методы, помеченные
Пример кода:
В этом примере класс
Почему именно так
✅Гибкость: Абстрактные базовые классы обеспечивают гибкость, позволяя определить обязательные методы, которые должны быть реализованы, без ограничения структуры классов.
✅Явное объявление интерфейсов: Использование
Можно реализовать интерфейсы с помощью абстрактных базовых классов (ABC), которые задают обязательные методы для реализации в подклассах. Это помогает стандартизировать и упрощать код.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Нет встроенной концепции интерфейсов. Однако интерфейсы можно реализовать с помощью абстрактных базовых классов (Abstract Base Classes, ABCs), предоставляемых модулем
abc. Абстрактные базовые классы позволяют определить методы, которые должны быть реализованы в подклассах, тем самым обеспечивая поведение, аналогичное интерфейсам.Зачем они нужны
1️⃣Обеспечение согласованности: Позволяют задать набор методов, которые должны быть реализованы в классах, гарантирующих, что эти классы будут иметь определенные методы.
2️⃣Полиморфизм: Позволяют работать с объектами различных классов через единый интерфейс, не зная их конкретные типы.
3️⃣Стандартизация кода: Помогают стандартизировать код, что делает его более читаемым и поддерживаемым.
Как реализовать интерфейс с помощью ABC
1️⃣Создание абстрактного базового класса: Используйте модуль
abc и декоратор @abstractmethod.2️⃣Определение абстрактных методов: Методы, помеченные
@abstractmethod, должны быть реализованы в подклассах.Пример кода:
from abc import ABC, abstractmethod
class MyInterface(ABC):
@abstractmethod
def my_method(self):
pass
class MyClass(MyInterface):
def my_method(self):
print("Реализация метода my_method в MyClass")
# Создание экземпляра класса
obj = MyClass()
obj.my_method() # Вывод: Реализация метода my_method в MyClass
# Попытка создать экземпляр абстрактного класса вызовет ошибку
try:
obj = MyInterface()
except TypeError as e:
print(e) # Вывод: Can't instantiate abstract class MyInterface with abstract methods my_method
В этом примере класс
MyInterface определяет абстрактный метод my_method, который должен быть реализован в любом подклассе. Класс MyClass реализует этот метод, что позволяет создавать его экземпляры.Почему именно так
✅Гибкость: Абстрактные базовые классы обеспечивают гибкость, позволяя определить обязательные методы, которые должны быть реализованы, без ограничения структуры классов.
✅Явное объявление интерфейсов: Использование
ABC и @abstractmethod делает намерения разработчика явными, облегчая понимание и сопровождение кода.Можно реализовать интерфейсы с помощью абстрактных базовых классов (ABC), которые задают обязательные методы для реализации в подклассах. Это помогает стандартизировать и упрощать код.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍7❤3
Какие принципы программирования знаешь ?
Спросят с вероятностью 3%
Существует множество принципов, которые помогают разработчикам писать чистый, поддерживаемый и эффективный код. Вот некоторые из ключевых принципов:
SOLID Принципы
1️⃣Single Responsibility Principle (Принцип единственной ответственности):
✅Класс должен иметь только одну причину для изменения, то есть выполнять только одну задачу или отвечать за один аспект системы.
✅Пример: Класс, который обрабатывает данные пользователя, не должен также управлять подключением к базе данных.
2️⃣Open/Closed Principle (Принцип открытости/закрытости):
✅Программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для модификации.
✅Пример: Вместо изменения существующего кода для добавления новой функциональности, можно добавить новые классы или методы, которые расширяют существующее поведение.
3️⃣Liskov Substitution Principle (Принцип подстановки Барбары Лисков):
✅Объекты в программе должны быть заменяемы экземплярами их подтипов без изменения корректности программы.
✅Пример: Если у вас есть базовый класс «Животное» и подкласс «Птица», вы должны иметь возможность заменить «Животное» на «Птицу» без проблем.
4️⃣Interface Segregation Principle (Принцип разделения интерфейса):
✅Клиенты не должны зависеть от интерфейсов, которые они не используют.
✅Пример: Вместо одного большого интерфейса, лучше создать несколько маленьких интерфейсов, чтобы классы могли реализовать только те интерфейсы, которые им нужны.
5️⃣Dependency Inversion Principle (Принцип инверсии зависимостей):
✅Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба типа модулей должны зависеть от абстракций.
✅Пример: Вместо того чтобы класс зависел от конкретного класса (например, класса базы данных), он должен зависеть от интерфейса или абстрактного класса, что позволяет легко менять реализацию.
Пример с SOLID и другими принципами
Принципы программирования, такие как SOLID, KISS, DRY, YAGNI, инкапсуляция, разделение обязанностей, закон Деметры и композиция вместо наследования, помогают писать чистый, поддерживаемый и эффективный код. Они направлены на уменьшение связности, улучшение модульности и облегчение тестирования и поддержки кода.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Существует множество принципов, которые помогают разработчикам писать чистый, поддерживаемый и эффективный код. Вот некоторые из ключевых принципов:
SOLID Принципы
1️⃣Single Responsibility Principle (Принцип единственной ответственности):
✅Класс должен иметь только одну причину для изменения, то есть выполнять только одну задачу или отвечать за один аспект системы.
✅Пример: Класс, который обрабатывает данные пользователя, не должен также управлять подключением к базе данных.
2️⃣Open/Closed Principle (Принцип открытости/закрытости):
✅Программные сущности (классы, модули, функции) должны быть открыты для расширения, но закрыты для модификации.
✅Пример: Вместо изменения существующего кода для добавления новой функциональности, можно добавить новые классы или методы, которые расширяют существующее поведение.
3️⃣Liskov Substitution Principle (Принцип подстановки Барбары Лисков):
✅Объекты в программе должны быть заменяемы экземплярами их подтипов без изменения корректности программы.
✅Пример: Если у вас есть базовый класс «Животное» и подкласс «Птица», вы должны иметь возможность заменить «Животное» на «Птицу» без проблем.
4️⃣Interface Segregation Principle (Принцип разделения интерфейса):
✅Клиенты не должны зависеть от интерфейсов, которые они не используют.
✅Пример: Вместо одного большого интерфейса, лучше создать несколько маленьких интерфейсов, чтобы классы могли реализовать только те интерфейсы, которые им нужны.
5️⃣Dependency Inversion Principle (Принцип инверсии зависимостей):
✅Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба типа модулей должны зависеть от абстракций.
✅Пример: Вместо того чтобы класс зависел от конкретного класса (например, класса базы данных), он должен зависеть от интерфейса или абстрактного класса, что позволяет легко менять реализацию.
Пример с SOLID и другими принципами
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self, engine):
self.engine = engine
def start(self):
self.engine.start()
# Принцип Dependency Injection
engine = Engine()
car = Car(engine)
car.start() # Выведет: Engine started
Принципы программирования, такие как SOLID, KISS, DRY, YAGNI, инкапсуляция, разделение обязанностей, закон Деметры и композиция вместо наследования, помогают писать чистый, поддерживаемый и эффективный код. Они направлены на уменьшение связности, улучшение модульности и облегчение тестирования и поддержки кода.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
🔥10👍6❤4🤔1
Что возвращает лямбда-функция lambda x, y: x if x > y else y при вызове с аргументами 5 и 3?
Anonymous Quiz
44%
Возвращает x
2%
Возвращает y
9%
Возвращает True
45%
Возвращает большее из двух значений, 5
🤯20👍10💊9😁2🎉1
Как создать абстрактный класс ?
Спросят с вероятностью 3%
Для создания абстрактного класса используется модуль abc (Abstract Base Classes). Абстрактный класс - это класс, который не может быть инстанцирован, и который обычно содержит один или несколько абстрактных методов. Абстрактный метод - это метод, который объявлен, но не реализован в абстрактном классе. Подклассы обязаны реализовать все абстрактные методы, чтобы быть инстанцированными.
Шаги для создания абстрактного класса
1️⃣Импорт модуля
2️⃣Создание класса, наследующего
3️⃣Определение абстрактных методов с помощью декоратора @abstractmethod: Методы, которые должны быть реализованы в подклассах, помечаются этим декоратором.
Пример кода
Объяснение примера
✅Абстрактный класс
✅Подкласс
✅Подкласс
Почему это нужно
✅Обеспечение реализации важных методов: Абстрактные классы гарантируют, что все подклассы будут содержать определенные методы, что важно для согласованности и предсказуемости поведения объектов.
✅Полиморфизм: Позволяет работать с разными объектами через единый интерфейс, что делает код гибким и расширяемым.
Абстрактный класс создается с помощью модуля abc. Он содержит абстрактные методы, которые должны быть реализованы в подклассах. Это помогает гарантировать, что все подклассы будут иметь определенные методы.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Для создания абстрактного класса используется модуль abc (Abstract Base Classes). Абстрактный класс - это класс, который не может быть инстанцирован, и который обычно содержит один или несколько абстрактных методов. Абстрактный метод - это метод, который объявлен, но не реализован в абстрактном классе. Подклассы обязаны реализовать все абстрактные методы, чтобы быть инстанцированными.
Шаги для создания абстрактного класса
1️⃣Импорт модуля
abc.2️⃣Создание класса, наследующего
ABC: Ваш абстрактный класс должен наследоваться от ABC, который является базовым классом для определения абстрактных классов.3️⃣Определение абстрактных методов с помощью декоратора @abstractmethod: Методы, которые должны быть реализованы в подклассах, помечаются этим декоратором.
Пример кода
from abc import ABC, abstractmethod
# Определение абстрактного класса
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
@abstractmethod
def move(self):
pass
# Попытка создать экземпляр абстрактного класса вызовет ошибку
try:
animal = Animal()
except TypeError as e:
print(e) # Вывод: Can't instantiate abstract class Animal with abstract methods make_sound, move
# Подкласс, реализующий все абстрактные методы
class Dog(Animal):
def make_sound(self):
return "Woof!"
def move(self):
return "Runs"
# Создание экземпляра подкласса
dog = Dog()
print(dog.make_sound()) # Вывод: Woof!
print(dog.move()) # Вывод: Runs
# Подкласс, не реализующий все абстрактные методы
class Fish(Animal):
def move(self):
return "Swims"
# Попытка создать экземпляр неполного подкласса вызовет ошибку
try:
fish = Fish()
except TypeError as e:
print(e) # Вывод: Can't instantiate abstract class Fish with abstract methods make_sound
Объяснение примера
✅Абстрактный класс
Animal: Определяет два абстрактных метода make_sound и move.✅Подкласс
Dog: Реализует оба абстрактных метода, поэтому его экземпляр может быть создан.✅Подкласс
Fish: Реализует только метод move, поэтому попытка создать его экземпляр вызовет ошибку, так как метод make_sound остался нереализованным.Почему это нужно
✅Обеспечение реализации важных методов: Абстрактные классы гарантируют, что все подклассы будут содержать определенные методы, что важно для согласованности и предсказуемости поведения объектов.
✅Полиморфизм: Позволяет работать с разными объектами через единый интерфейс, что делает код гибким и расширяемым.
Абстрактный класс создается с помощью модуля abc. Он содержит абстрактные методы, которые должны быть реализованы в подклассах. Это помогает гарантировать, что все подклассы будут иметь определенные методы.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍22❤4
Какой метод используется для обеспечения, что класс наследует атрибуты и методы нескольких родительских классов?
Anonymous Quiz
11%
Динамическое наследование
81%
Множественное наследование
4%
Прототипное наследование
4%
Интерфейсное наследование
👍8👾2
Чем отличаются методы сокрытия ?
Спросят с вероятностью 3%
Методы и атрибуты класса могут быть скрыты от внешнего использования с помощью различных уровней сокрытия. Сокрытие реализуется с помощью соглашений об именах, а не с помощью жесткой инкапсуляции, как в некоторых других языках программирования. Основные уровни сокрытия включают публичные, защищенные и приватные методы и атрибуты.
Публичные методы и атрибуты
Доступны из любого места, как внутри класса, так и за его пределами. Их имена не начинаются с подчеркиваний.
Пример:
Защищенные методы и атрибуты
Не предназначены для использования за пределами класса и его подклассов. Они обозначаются одним подчеркиванием в начале имени. Это всего лишь соглашение, сигнализирующее другим разработчикам, что такие методы и атрибуты не следует использовать вне класса или его подклассов.
Пример:
Приватные методы и атрибуты
Скрыты от внешнего доступа и доступны только внутри самого класса. Они обозначаются двумя подчеркиваниями в начале имени. Python реализует это с помощью механизма именования, который изменяет имя метода или атрибута, добавляя к нему имя класса, чтобы затруднить доступ извне.
Пример:
Почему это важно
✅Инкапсуляция: Сокрытие позволяет инкапсулировать данные и методы, защищая внутреннее состояние объекта и предотвращая неправильное использование или изменение извне.
✅Читаемость и поддерживаемость: Соглашения об именах помогают разработчикам понять, какие методы и атрибуты предназначены для внутреннего использования, а какие могут быть использованы внешними клиентами.
✅Безопасность кода: Защищенные и приватные методы и атрибуты снижают риск случайного изменения внутреннего состояния объекта, обеспечивая более надежное и предсказуемое поведение программного кода.
✅Публичные методы и атрибуты доступны отовсюду.
✅Защищенные методы и атрибуты обозначаются одним подчеркиванием и предназначены для использования только внутри класса и его подклассов.
✅Приватные методы и атрибуты обозначаются двумя подчеркиваниями и доступны только внутри класса.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Методы и атрибуты класса могут быть скрыты от внешнего использования с помощью различных уровней сокрытия. Сокрытие реализуется с помощью соглашений об именах, а не с помощью жесткой инкапсуляции, как в некоторых других языках программирования. Основные уровни сокрытия включают публичные, защищенные и приватные методы и атрибуты.
Публичные методы и атрибуты
Доступны из любого места, как внутри класса, так и за его пределами. Их имена не начинаются с подчеркиваний.
Пример:
class MyClass:
def __init__(self):
self.public_attribute = "I am public"
def public_method(self):
return "This is a public method"
obj = MyClass()
print(obj.public_attribute) # Вывод: I am public
print(obj.public_method()) # Вывод: This is a public method
Защищенные методы и атрибуты
Не предназначены для использования за пределами класса и его подклассов. Они обозначаются одним подчеркиванием в начале имени. Это всего лишь соглашение, сигнализирующее другим разработчикам, что такие методы и атрибуты не следует использовать вне класса или его подклассов.
Пример:
class MyClass:
def __init__(self):
self._protected_attribute = "I am protected"
def _protected_method(self):
return "This is a protected method"
class SubClass(MyClass):
def access_protected(self):
return self._protected_method()
obj = MyClass()
sub_obj = SubClass()
print(sub_obj.access_protected()) # Вывод: This is a protected method
Приватные методы и атрибуты
Скрыты от внешнего доступа и доступны только внутри самого класса. Они обозначаются двумя подчеркиваниями в начале имени. Python реализует это с помощью механизма именования, который изменяет имя метода или атрибута, добавляя к нему имя класса, чтобы затруднить доступ извне.
Пример:
class MyClass:
def __init__(self):
self.__private_attribute = "I am private"
def __private_method(self):
return "This is a private method"
def access_private(self):
return self.__private_method()
obj = MyClass()
try:
print(obj.__private_attribute)
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '__private_attribute'
try:
print(obj.__private_method())
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '__private_method'
# Доступ к приватным методам через публичный метод класса
print(obj.access_private()) # Вывод: This is a private method
Почему это важно
✅Инкапсуляция: Сокрытие позволяет инкапсулировать данные и методы, защищая внутреннее состояние объекта и предотвращая неправильное использование или изменение извне.
✅Читаемость и поддерживаемость: Соглашения об именах помогают разработчикам понять, какие методы и атрибуты предназначены для внутреннего использования, а какие могут быть использованы внешними клиентами.
✅Безопасность кода: Защищенные и приватные методы и атрибуты снижают риск случайного изменения внутреннего состояния объекта, обеспечивая более надежное и предсказуемое поведение программного кода.
✅Публичные методы и атрибуты доступны отовсюду.
✅Защищенные методы и атрибуты обозначаются одним подчеркиванием и предназначены для использования только внутри класса и его подклассов.
✅Приватные методы и атрибуты обозначаются двумя подчеркиваниями и доступны только внутри класса.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤8👍7
Какое утверждение наилучшим образом описывает роль миксина?
Anonymous Quiz
11%
Миксины предназначены для замены классов наследования.
22%
Миксины используются для создания новых классов на основе абстрактных базовых классов.
52%
Миксины служат для расширения функциональности класса без использования наследования.
15%
Миксины предназначены для динамического изменения экземпляров класса во время выполнения.
🤔29🤯2👍1
Какие паттерны проектирования используешь ?
Спросят с вероятностью 3%
Паттерны проектирования являются повторяемыми решениями общих проблем проектирования в объектно-ориентированном программировании. Они помогают создавать гибкие и легко поддерживаемые системы. Вот некоторые из наиболее часто используемых паттернов проектирования:
1️⃣Одиночка (Singleton)
Цель: Гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
Пример кода:
2️⃣Строитель (Builder)
Цель: Отделяет создание сложного объекта от его представления, позволяя использовать один и тот же процесс создания для различных представлений.
Пример кода:
3️⃣Фабричный метод (Factory Method)
Цель: Определяет интерфейс для создания объекта, но позволяет подклассам изменить тип создаваемого объекта.
Пример кода:
Использование паттернов проектирования помогает создавать гибкие, масштабируемые и легко поддерживаемые системы. Они позволяют решать типичные задачи проектирования, избегая распространенных ошибок.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Паттерны проектирования являются повторяемыми решениями общих проблем проектирования в объектно-ориентированном программировании. Они помогают создавать гибкие и легко поддерживаемые системы. Вот некоторые из наиболее часто используемых паттернов проектирования:
1️⃣Одиночка (Singleton)
Цель: Гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.
Пример кода:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # Вывод: True
2️⃣Строитель (Builder)
Цель: Отделяет создание сложного объекта от его представления, позволяя использовать один и тот же процесс создания для различных представлений.
Пример кода:
class Product:
def __init__(self):
self.parts = []
def add(self, part):
self.parts.append(part)
def show(self):
return ", ".join(self.parts)
class Builder:
def build_part_a(self):
pass
def build_part_b(self):
pass
class ConcreteBuilder(Builder):
def __init__(self):
self.product = Product()
def build_part_a(self):
self.product.add("Part A")
def build_part_b(self):
self.product.add("Part B")
def get_product(self):
return self.product
class Director:
def __init__(self, builder):
self._builder = builder
def construct(self):
self._builder.build_part_a()
self._builder.build_part_b()
builder = ConcreteBuilder()
director = Director(builder)
director.construct()
product = builder.get_product()
print(product.show()) # Вывод: Part A, Part B
3️⃣Фабричный метод (Factory Method)
Цель: Определяет интерфейс для создания объекта, но позволяет подклассам изменить тип создаваемого объекта.
Пример кода:
class Product:
def operation(self):
pass
class ConcreteProductA(Product):
def operation(self):
return "ConcreteProductA"
class ConcreteProductB(Product):
def operation(self):
return "ConcreteProductB"
class Creator:
def factory_method(self):
pass
def some_operation(self):
product = self.factory_method()
return f"Creator: The same creator's code has just worked with {product.operation()}"
class ConcreteCreatorA(Creator):
def factory_method(self):
return ConcreteProductA()
class ConcreteCreatorB(Creator):
def factory_method(self):
return ConcreteProductB()
creator_a = ConcreteCreatorA()
print(creator_a.some_operation()) # Вывод: Creator: The same creator's code has just worked with ConcreteProductA
creator_b = ConcreteCreatorB()
print(creator_b.some_operation()) # Вывод: Creator: The same creator's code has just worked with ConcreteProductB
Использование паттернов проектирования помогает создавать гибкие, масштабируемые и легко поддерживаемые системы. Они позволяют решать типичные задачи проектирования, избегая распространенных ошибок.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍19❤1
Как Python определяет порядок разрешения методов (MRO) в множественном наследовании?
Anonymous Quiz
49%
Используя глубину первого поиска слева направо.
7%
Следуя принципу последнего использования.
20%
Приоритет дается классам, объявленным последними.
24%
Используя алгоритм C3 линеаризации.
👍7👀2❤1💊1
В чем основные принципы инкапсуляции ?
Спросят с вероятностью 3%
Инкапсуляция является одним из основных принципов объектно-ориентированного программирования (ООП). Она подразумевает объединение данных и методов, работающих с этими данными, в единый объект, а также скрытие внутренней реализации этого объекта от внешнего мира. Это достигается с помощью контроля доступа к атрибутам и методам класса. Основные принципы инкапсуляции включают:
1️⃣Сокрытие данных
Заключается в ограничении прямого доступа к атрибутам объекта. Это достигается с помощью модификаторов доступа, таких как публичные, защищенные и приватные атрибуты.
Пример:
Публичные атрибуты: Доступны отовсюду.
2️⃣Контроль доступа к данным
Осуществляется с помощью геттеров и сеттеров (методы для получения и изменения значений атрибутов). Это позволяет добавить логику в методы доступа, например, проверку корректности значений.
Пример:
3️⃣Изоляция внутренней реализации
Позволяет изолировать внутреннюю реализацию объекта от внешнего мира. Внешний код использует только публичные методы для взаимодействия с объектом, не зная о деталях его внутренней структуры.
Пример:
4️⃣Повышение надежности и упрощение сопровождения кода
Внутренние детали реализации могут быть изменены без влияния на внешний код. Это делает код более надежным и легким в сопровождении.
Пример:
Изменение внутренней реализации:
Инкапсуляция объединяет данные и методы в объекте, скрывая внутреннюю реализацию и предоставляя публичный интерфейс для взаимодействия. Это улучшает надежность, безопасность и сопровождение кода.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Инкапсуляция является одним из основных принципов объектно-ориентированного программирования (ООП). Она подразумевает объединение данных и методов, работающих с этими данными, в единый объект, а также скрытие внутренней реализации этого объекта от внешнего мира. Это достигается с помощью контроля доступа к атрибутам и методам класса. Основные принципы инкапсуляции включают:
1️⃣Сокрытие данных
Заключается в ограничении прямого доступа к атрибутам объекта. Это достигается с помощью модификаторов доступа, таких как публичные, защищенные и приватные атрибуты.
Пример:
Публичные атрибуты: Доступны отовсюду.
class MyClass:
def __init__(self):
self.public_attribute = "Public"
2️⃣Контроль доступа к данным
Осуществляется с помощью геттеров и сеттеров (методы для получения и изменения значений атрибутов). Это позволяет добавить логику в методы доступа, например, проверку корректности значений.
Пример:
class MyClass:
def __init__(self):
self.__private_attribute = "Initial Value"
def get_private_attribute(self):
return self.__private_attribute
def set_private_attribute(self, value):
if isinstance(value, str):
self.__private_attribute = value
else:
raise ValueError("Value must be a string")
obj = MyClass()
print(obj.get_private_attribute()) # Вывод: Initial Value
obj.set_private_attribute("New Value")
print(obj.get_private_attribute()) # Вывод: New Value
3️⃣Изоляция внутренней реализации
Позволяет изолировать внутреннюю реализацию объекта от внешнего мира. Внешний код использует только публичные методы для взаимодействия с объектом, не зная о деталях его внутренней структуры.
Пример:
class BankAccount:
def __init__(self, balance):
self.__balance = balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
else:
raise ValueError("Deposit amount must be positive")
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
else:
raise ValueError("Invalid withdraw amount")
def get_balance(self):
return self.__balance
account = BankAccount(1000)
account.deposit(500)
print(account.get_balance()) # Вывод: 1500
account.withdraw(200)
print(account.get_balance()) # Вывод: 1300
4️⃣Повышение надежности и упрощение сопровождения кода
Внутренние детали реализации могут быть изменены без влияния на внешний код. Это делает код более надежным и легким в сопровождении.
Пример:
Изменение внутренней реализации:
class BankAccount:
def __init__(self, balance):
self.__balance = balance
def deposit(self, amount):
if amount > 0:
self.__balance += amount
else:
raise ValueError("Deposit amount must be positive")
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
else:
raise ValueError("Invalid withdraw amount")
def get_balance(self):
return self.__balance
# Внешний код не изменяется
account = BankAccount(1000)
account.deposit(500)
print(account.get_balance()) # Вывод: 1500
account.withdraw(200)
print(account.get_balance()) # Вывод: 1300
Инкапсуляция объединяет данные и методы в объекте, скрывая внутреннюю реализацию и предоставляя публичный интерфейс для взаимодействия. Это улучшает надежность, безопасность и сопровождение кода.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍11
Как декоратор Middleware в Python обычно используется в веб-фреймворках?
Anonymous Quiz
44%
Для управления потоком данных между клиентом и сервером.
39%
Для валидации данных запроса перед передачей контроллеру.
9%
Для сериализации ответов сервера в JSON.
7%
Для кэширования страниц на стороне сервера.
💊20🤔4👍2❤1👀1
Как связаны new и singleton ?
Спросят с вероятностью 3%
Методы
Мечасто используется для реализации Singleton в Python. Singleton — это паттерн проектирования, который гарантирует, что у класса будет только один экземпляр на протяжении всего жизненного цикла приложения. Метод new отвечает за создание нового экземпляра класса, и именно его можно использовать для контроля создания объектов.
Метод new — это специальный метод, который вызывается перед методом init. Он отвечает за создание и возвращение нового экземпляра класса. В отличие от метода init, который инициализирует уже существующий объект, new создаёт новый объект класса.
Пример использования new в Singleton
Для реализации паттерна Singleton с использованием метода new нужно сделать так, чтобы метод new возвращал один и тот же экземпляр класса при каждом вызове.
Пример кода:
Пошаговое объяснение:
1️⃣Статический атрибут _instance: Используется для хранения единственного экземпляра класса.
✅Проверяет, существует ли уже экземпляр класса (cls._instance is None).
✅Если не существует, создаёт новый экземпляр с помощью super(Singleton, cls).new(cls, args, kwargs) и сохраняет его в cls._instance.
✅Возвращает экземпляр класса, хранящийся в cls._instance.
3️⃣Метод init:
✅Инициализирует экземпляр только один раз. Проверка if not hasattr(self, '_initialized') предотвращает повторную инициализацию объекта.
Почему Singleton и new связаны
✅Контроль создания объектов: Метод new позволяет контролировать процесс создания объекта, что идеально подходит для реализации Singleton.
✅Единственность экземпляра: С помощью new можно гарантировать, что будет создан только один экземпляр класса, поскольку new может возвращать уже существующий экземпляр.
✅Разделение обязанностей: Метод new отвечает за создание (или возврат существующего) экземпляра, а метод init — за его инициализацию, если это необходимо.
Метод new используется для создания новых экземпляров класса и идеально подходит для реализации паттерна Singleton, так как позволяет контролировать создание единственного экземпляра класса и возвращать его при каждом вызове.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Методы
__new__ и паттерн Singleton тесно связаны, поскольку методью 3%Мечасто используется для реализации Singleton в Python. Singleton — это паттерн проектирования, который гарантирует, что у класса будет только один экземпляр на протяжении всего жизненного цикла приложения. Метод new отвечает за создание нового экземпляра класса, и именно его можно использовать для контроля создания объектов.
Метод new — это специальный метод, который вызывается перед методом init. Он отвечает за создание и возвращение нового экземпляра класса. В отличие от метода init, который инициализирует уже существующий объект, new создаёт новый объект класса.
Пример использования new в Singleton
Для реализации паттерна Singleton с использованием метода new нужно сделать так, чтобы метод new возвращал один и тот же экземпляр класса при каждом вызове.
Пример кода:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self, value):
if not hasattr(self, '_initialized'): # Проверка на инициализацию
self.value = value
self._initialized = True
# Проверка работы Singleton
singleton1 = Singleton("First Instance")
print(singleton1.value) # Вывод: First Instance
singleton2 = Singleton("Second Instance")
print(singleton2.value) # Вывод: First Instance
print(singleton1 is singleton2) # Вывод: True
Пошаговое объяснение:
1️⃣Статический атрибут _instance: Используется для хранения единственного экземпляра класса.
2️⃣
Метод
eton1 = Sin
✅Проверяет, существует ли уже экземпляр класса (cls._instance is None).
✅Если не существует, создаёт новый экземпляр с помощью super(Singleton, cls).new(cls, args, kwargs) и сохраняет его в cls._instance.
✅Возвращает экземпляр класса, хранящийся в cls._instance.
3️⃣Метод init:
✅Инициализирует экземпляр только один раз. Проверка if not hasattr(self, '_initialized') предотвращает повторную инициализацию объекта.
Почему Singleton и new связаны
✅Контроль создания объектов: Метод new позволяет контролировать процесс создания объекта, что идеально подходит для реализации Singleton.
✅Единственность экземпляра: С помощью new можно гарантировать, что будет создан только один экземпляр класса, поскольку new может возвращать уже существующий экземпляр.
✅Разделение обязанностей: Метод new отвечает за создание (или возврат существующего) экземпляра, а метод init — за его инициализацию, если это необходимо.
Метод new используется для создания новых экземпляров класса и идеально подходит для реализации паттерна Singleton, так как позволяет контролировать создание единственного экземпляра класса и возвращать его при каждом вызове.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍9👀4💊2
Какой механизм наилучше соответствует принципу инкапсуляции для скрытия данных класса?
Anonymous Quiz
8%
Использование модулей для разделения классов
3%
Определение всех методов как статических
40%
Передача всех переменных только через геттеры и сеттеры
49%
Префикс переменных класса с двумя подчеркиваниями для обозначения приватности
💊14🤔6👍1
Как бы реализовал паттерн singleton ?
Спросят с вероятностью 3%
Паттерн Singleton используется для того, чтобы создать класс, который имеет только один экземпляр. Это полезно, когда нужно ограничить количество объектов, например, для управления ресурсами (как подключение к базе данных) или для хранения глобального состояния.
Существует несколько способов реализовать Singleton. Рассмотрим один из наиболее распространенных способов - использование приватного конструктора и класса-метода для получения экземпляра.
Объяснение кода
1️⃣Приватный атрибут _instance
✅Этот атрибут используется для хранения единственного экземпляра класса.
2️⃣Метод __new__:
✅
✅Если экземпляр ещё не был создан,
3️⃣Метод init:
✅Методреализовалвызывается каждый раз при создании экземпляра. Чтобы избежать повторной инициализации, проверяем наличие атрибута
Можно также реализовать Singleton с помощью декоратора:
Объяснение
1️⃣Декоратор singleton:
✅Хранит экземпляры класса в словаре
✅Если экземпляра класса ещё нет в словаре, он создаётся и добавляется в словарь.
✅Возвращается существующий или новый экземпляр класса.
Паттерн Singleton гарантирует, что класс имеет только один экземпляр. Это достигается контролем создания экземпляров через методые
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Паттерн Singleton используется для того, чтобы создать класс, который имеет только один экземпляр. Это полезно, когда нужно ограничить количество объектов, например, для управления ресурсами (как подключение к базе данных) или для хранения глобального состояния.
Существует несколько способов реализовать Singleton. Рассмотрим один из наиболее распространенных способов - использование приватного конструктора и класса-метода для получения экземпляра.
class Singleton:
__instance = None
def __new__(cls, args, kwargs):
if cls.__instance is None:
cls.__instance = super(Singleton, cls).__new__(cls, args, kwargs)
return cls.__instance
def __init__(self):
if not hasattr(self, 'initialized'):
self.initialized = True
# Инициализация объекта, если нужно
self.value = 0
# Проверка работы
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 0
singleton1.value = 42
print(singleton2.value) # Выведет: 42
Объяснение кода
1️⃣Приватный атрибут _instance
_:✅Этот атрибут используется для хранения единственного экземпляра класса.
2️⃣Метод __new__:
✅
__new__ - это метод, который создаёт новый экземпляр класса. Если экземпляр уже существует (cls.__instance не None), возвращается существующий экземпляр.✅Если экземпляр ещё не был создан,
super(Singleton, cls).__new__(cls, args, kwargs) создаёт новый экземпляр и сохраняет его в cls.__instance.3️⃣Метод init:
✅Методреализовалвызывается каждый раз при создании экземпляра. Чтобы избежать повторной инициализации, проверяем наличие атрибута
initialized.Можно также реализовать Singleton с помощью декоратора:
def singleton(cls):
instances = {}
def get_instance(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class SingletonClass:
def __init__(self):
self.value = 0
# Проверка работы
singleton1 = SingletonClass()
singleton2 = SingletonClass()
print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 0
singleton1.value = 42
print(singleton2.value) # Выведет: 42
Объяснение
1️⃣Декоратор singleton:
✅Хранит экземпляры класса в словаре
instances.✅Если экземпляра класса ещё нет в словаре, он создаётся и добавляется в словарь.
✅Возвращается существующий или новый экземпляр класса.
Паттерн Singleton гарантирует, что класс имеет только один экземпляр. Это достигается контролем создания экземпляров через методые
None), или декоратор. Singleton полезен для управления ресурсами и глобального состояния.👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
👍17
Какое максимально допустимое количество символов рекомендует PEP8 использовать в строке кода?
Anonymous Quiz
51%
79 символов
31%
120 символов
7%
100 символов
11%
90 символов
👍4
На что влияет атрибут slots ?
Спросят с вероятностью 3%
Атрибут __slots__ используется для ограничения атрибутов, которые можно добавлять экземплярам класса, и для оптимизации использования памяти. Это особенно полезно в сценариях, где создаётся много объектов одного класса.
Как он работает
По умолчанию, Python использует словарь (
Когда вы определяете атрибут slots в классе, вы тем самым ограничиваете класс набором конкретных атрибутов. Это убирает необходимость в словаре для хранения атрибутов и может значительно сократить использование памяти.
Пример использования
Объяснение
1️⃣Ограничение атрибутов:
✅В классе
✅ В классе
2️⃣Использование памяти:
✅Экземпляры класса состью 3%
Азанимают меньше памяти, так как для хранения атрибутов не используется словарь.
✅Это может существенно уменьшить использование памяти в случаях, когда создаётся много экземпляров класса.
Преимущества:
✅Снижение использования памяти: Экономия памяти за счёт отказа от словарей для хранения атрибутов.
✅Ускорение доступа к атрибутам: Быстрый доступ к атрибутам благодаря фиксированному набору атрибутов.
Недостатки:
✅Ограничение гибкости: Невозможно добавлять новые атрибуты, не указанные в
✅Наследование: Классы-наследники должны явно указывать slots, чтобы сохранить оптимизацию.
Атрибут slots ограничивает набор атрибутов экземпляров класса и уменьшает использование памяти за счёт отказа от словарей для хранения атрибутов. Это повышает эффективность, но уменьшает гибкость.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
Спросят с вероятностью 3%
Атрибут __slots__ используется для ограничения атрибутов, которые можно добавлять экземплярам класса, и для оптимизации использования памяти. Это особенно полезно в сценариях, где создаётся много объектов одного класса.
Как он работает
По умолчанию, Python использует словарь (
__dict__) для хранения атрибутов экземпляров. Это даёт большую гибкость, но также приводит к значительному расходу памяти.Когда вы определяете атрибут slots в классе, вы тем самым ограничиваете класс набором конкретных атрибутов. Это убирает необходимость в словаре для хранения атрибутов и может значительно сократить использование памяти.
Пример использования
class RegularClass:
def __init__(self, x, y):
self.x = x
self.y = y
class SlotsClass:
_(self, x, = ['x', 'y']
def __init__(self, x, y):
self.x = x
self.y = y
# Создадим экземпляры классов
regular_instance = RegularClass(1, 2)
slots_instance = SlotsClass(1, 2)
# Попробуем добавить новый атрибут
regular_instance.z = 3 # Это работает
# slots_instance.z = 3 # Это вызовет ошибку AttributeError
print(regular_instance.__dict__) # {'x': 1, 'y': 2, 'z': 3}
# print(slots_instance.__dict__) # AttributeError: 'SlotsClass' object has no attribute '__dict__'
# Проверим использование памяти
import sys
print(sys.getsizeof(regular_instance)) # Выведет размер в байтах
print(sys.getsizeof(slots_instance)) # Выведет размер в байтах, который будет меньше
Объяснение
1️⃣Ограничение атрибутов:
✅В классе
RegularClass можно добавлять любые атрибуты, так как используется словарь (__dict__).✅ В классе
SlotsClass можно добавлять только атрибуты, указанные в= x
2️⃣Использование памяти:
✅Экземпляры класса состью 3%
Азанимают меньше памяти, так как для хранения атрибутов не используется словарь.
✅Это может существенно уменьшить использование памяти в случаях, когда создаётся много экземпляров класса.
Преимущества:
✅Снижение использования памяти: Экономия памяти за счёт отказа от словарей для хранения атрибутов.
✅Ускорение доступа к атрибутам: Быстрый доступ к атрибутам благодаря фиксированному набору атрибутов.
Недостатки:
✅Ограничение гибкости: Невозможно добавлять новые атрибуты, не указанные в
_slots__ в ✅Наследование: Классы-наследники должны явно указывать slots, чтобы сохранить оптимизацию.
Атрибут slots ограничивает набор атрибутов экземпляров класса и уменьшает использование памяти за счёт отказа от словарей для хранения атрибутов. Это повышает эффективность, но уменьшает гибкость.
👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 1096 вопроса на Python разработчика. Ставь 👍 если нравится контент
🔐 База собесов | 🔐 База тестовых
❤3💊2👍1
Какая транзакция в SQL не соответствует принципу Durability в ACID, если система перезагружается во время выполнения?
Anonymous Quiz
42%
Транзакция, записывающая данные на нестабильное хранилище
30%
Транзакция с использованием uncommitted read
17%
Транзакция с использованием двухфазной фиксации
11%
Транзакция, зафиксированная в журнале транзакций
❤2