Python | Вопросы собесов
13.9K subscribers
37 photos
1 file
927 links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Что такое MRO?

MRO (Method Resolution Order) — это порядок, в котором Python ищет методы в иерархии классов при множественном наследовании. MRO определяет последовательность классов, в которых Python будет искать атрибуты или методы, начиная с самого класса и двигаясь вверх по иерархии. Python использует алгоритм C3 Linearization для вычисления MRO. Порядок можно просмотреть с помощью метода `mro()` или функции `super()`.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥113
🤔 Методы __len__ и __abs__?

Являются специальными методами, которые позволяют классам взаимодействовать с встроенными функциями len() и abs() соответственно. Эти методы помогают сделать пользовательские объекты более интуитивно понятными и удобными для использования.

🚩Метод __len__

Используется для определения длины объекта. Он должен возвращать количество элементов в объекте или какую-то другую числовую характеристику длины объекта. Например, для списков, кортежей и строк метод __len__ возвращает количество элементов или символов.
class MyCollection:
def __init__(self, items):
self.items = items

def __len__(self):
return len(self.items)

collection = MyCollection([1, 2, 3, 4, 5])
print(len(collection)) # Вывод: 5


🚩Метод __abs__

Метод __abs__ используется для определения абсолютного значения объекта. Он должен возвращать абсолютное значение объекта, как это делает встроенная функция abs() для чисел.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __abs__(self):
return (self.x**2 + self.y**2) ** 0.5

vector = Vector(3, 4)
print(abs(vector)) # Вывод: 5.0


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Для чего нужен PEP8?

PEP8 — это стиль кодирования, который описывает рекомендуемые стандарты для написания кода на Python. Его цель — сделать код более читаемым и согласованным между разными проектами и разработчиками. PEP8 охватывает различные аспекты, такие как отступы, именование переменных и функций, использование пробелов и длину строк. Соблюдение PEP8 улучшает качество кода и облегчает его поддержку и совместную работу над проектами.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥12💊1
🤔 Что такое конструктор класса?

Это специальный метод, который вызывается автоматически при создании нового объекта класса. Этот метод называется __init__(). Он используется для инициализации объекта, то есть задания начальных значений атрибутов объекта.

🚩Создание класса с конструктором

Необходимо определить метод __init__() внутри класса.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def display_info(self):
print(f"Name: {self.name}, Age: {self.age}")


🚩Создание объекта класса

Включает вызов конструктора. Для этого используется имя класса, за которым следуют круглые скобки с аргументами, передаваемыми в конструктор.
person1 = Person("Alice", 30)
person1.display_info()


🚩Пример с доп. методами

Кроме конструктора, классы могут иметь и другие методы для выполнения различных операций.
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height

def area(self):
return self.width * self.height

def perimeter(self):
return 2 * (self.width + self.height)

# Создание объекта
rect1 = Rectangle(10, 5)
print(f"Area: {rect1.area()}") # Вывод: Area: 50
print(f"Perimeter: {rect1.perimeter()}") # Вывод: Perimeter: 30


Класс Rectangle имеет конструктор, который инициализирует атрибуты width и height. Методы area() и perimeter() вычисляют и возвращают площадь и периметр прямоугольника соответственно.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💊2
🤔 Что такое асинхронность?

Асинхронность в Python позволяет выполнять несколько операций одновременно, не блокируя выполнение программы. Асинхронные функции определяются с помощью ключевого слова `async`, и их выполнение управляется событиями, что делает возможным параллельное выполнение задач без использования потоков или процессов. Основные функции асинхронности включают `asyncio` и `await` для управления асинхронными операциями. Асинхронность особенно полезна для ввода-вывода и сетевых операций.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥6💊1
🤔 Что такое рефлексия?

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

🚩Возможности

🟠Получение информации о типах данных и структурах
Определение типа объекта и его структуры во время выполнения.

🟠Динамическое создание и манипулирование объектами
Создание экземпляров классов и вызов их методов без явного указания имен классов и методов в коде.

🟠Инспекция и изменение атрибутов и методов
Доступ к атрибутам и методам объектов, их изменение и вызов.

🚩Примеры рефлексии в Python

1⃣Получение типа объекта и структуры
x = [1, 2, 3]

print(type(x)) # <class 'list'>
print(dir(x)) # Выводит все методы и атрибуты объекта списка


2⃣Проверка наличия и получение атрибутов и методов
class MyClass:
def __init__(self, value):
self.value = value

def my_method(self):
return "Hello, world!"

obj = MyClass(10)

# Проверка наличия атрибута
print(hasattr(obj, 'value')) # True

# Получение значения атрибута
print(getattr(obj, 'value')) # 10

# Установка значения атрибута
setattr(obj, 'value', 20)
print(getattr(obj, 'value')) # 20

# Проверка наличия метода
print(hasattr(obj, 'my_method')) # True

# Вызов метода
method = getattr(obj, 'my_method')
print(method()) # Hello, world!


3⃣Динамическое создание объектов и вызов методов
class MyClass:
def __init__(self, value):
self.value = value

def my_method(self):
return f"Value is {self.value}"

# Динамическое создание объекта
klass = globals()['MyClass']
obj = klass(42)

# Динамический вызов метода
method = getattr(obj, 'my_method')
print(method()) # Value is 42


4⃣Использование модуля inspect
import inspect

def my_function(param1, param2):
pass

# Получение информации о параметрах функции
signature = inspect.signature(my_function)
for param in signature.parameters.values():
print(param.name, param.default, param.annotation)

# Получение всех методов класса
class MyClass:
def method(self):
pass

methods = inspect.getmembers(MyClass, predicate=inspect.isfunction)
print(methods) # [('method', <function MyClass.method at 0x...>)]


🚩Плюсы

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

🚩Минусы

Сложность
Может сделать код более сложным для понимания и сопровождения.
Производительность
Рефлексия может повлиять на производительность, особенно при частом использовании в критически важных участках кода.
Безопасность
Использование рефлексии может открыть доступ к внутренним частям объектов, что может быть потенциально опасным при неправильном использовании.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое ACID в SQL?

ACID — это набор свойств транзакций в базах данных, которые обеспечивают надёжность и целостность данных: атомарность, согласованность, изолированность и долговечность. Атомарность гарантирует, что все операции в транзакции выполняются как одно целое, согласованность поддерживает данные в согласованном состоянии, изолированность защищает от влияния других транзакций, а долговечность обеспечивает сохранение данных после завершения транзакции. Эти свойства помогают избежать ошибок и сбоев в обработке данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥9💊1
🤔 Что такое деструктор класса?

Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В 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
👍62
🤔 В чем суть принципа REST?

REST (Representational State Transfer) — это архитектурный стиль для разработки веб-сервисов, который использует стандартные методы HTTP для взаимодействия между клиентом и сервером. В REST каждая операция выполняется с использованием определённого HTTP-метода: GET для получения данных, POST для создания, PUT для обновления и DELETE для удаления. RESTful API использует унифицированные ресурсы и URL для представления данных, а также статeless-коммуникацию между клиентом и сервером. Основной принцип REST — это простота и масштабируемость.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💊3🔥21
🤔 Как создать абстрактный класс?

Используется модуль abc (Abstract Base Classes). Абстрактный класс не может быть инстанцирован и предназначен для создания шаблонов, которые должны быть реализованы в подклассах.

🚩Шаги

1⃣Импортирование модуля `abc`
Для использования абстрактных классов и методов нужно импортировать модуль 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

# Попытка создания экземпляра абстрактного класса приведет к ошибке
# animal = Animal() # TypeError: 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"

class Bird(Animal):
def make_sound(self):
return "Tweet"

def move(self):
return "Flies"

# Теперь можно создать экземпляры подклассов
dog = Dog()
print(dog.make_sound()) # Woof
print(dog.move()) # Runs

bird = Bird()
print(bird.make_sound()) # Tweet
print(bird.move()) # Flies


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🤔 В чем отличие асинхронности, threading'га и мультипроцессинга?

Асинхронность позволяет выполнять задачи без блокировки основного потока, используя событийный цикл и `async/await`, что делает её эффективной для операций ввода-вывода. Threading использует несколько потоков в одном процессе для выполнения задач параллельно, но все потоки делят одну память и могут сталкиваться с проблемами синхронизации. Мультипроцессинг создает несколько процессов, каждый из которых имеет собственную память и может выполнять задачи независимо, что позволяет использовать все ядра процессора. Асинхронность предпочтительнее для ввода-вывода, а потоки и процессы — для вычислительно затратных операций.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥111💊1
🤔 Какие есть методы у классов?

🚩Типы методов

🟠Обычные методы (Instance Methods)
Обычные методы работают с экземплярами класса и могут изменять их состояние. Они принимают первым аргументом ссылку на сам экземпляр (self).
class Dog:
def __init__(self, name):
self.name = name # Атрибут объекта

def bark(self):
return f"{self.name} says woof!"

dog = Dog("Buddy")
print(dog.bark()) # Buddy says woof!


🟠Методы класса (Class Methods)
Методы класса работают с самим классом, а не с экземплярами. Они принимают первым аргументом ссылку на класс (cls). Для создания метода класса используется декоратор @classmethod.
class Dog:
species = "Canis lupus familiaris" # Атрибут класса

@classmethod
def get_species(cls):
return cls.species

print(Dog.get_species()) # Canis lupus familiaris


🟠Статические методы (Static Methods)
Статические методы не зависят ни от экземпляра класса, ни от самого класса. Они не получают автоматически ни ссылку на экземпляр (self), ни ссылку на класс (cls). Для создания статического метода используется декоратор @staticmethod.
class Dog:
@staticmethod
def is_domesticated():
return True

print(Dog.is_domesticated()) # True


🟠Магические методы (Dunder Methods)
Магические методы (или dunder методы, от "double underscore") определяют специальные поведения объектов, такие как инициализация, строковое представление, перегрузка операторов и другие. Они имеют двойное подчеркивание в начале и в конце имени.
Некоторые распространенные магические методы:
__init__: Инициализация объекта.
__str__: Строковое представление объекта.
__repr__: Официальное строковое представление объекта, используемое для отладки.
__len__: Определяет длину объекта.
__add__: Перегружает оператор сложения.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age

def __str__(self):
return f"{self.name} is {self.age} years old"

dog = Dog("Buddy", 2)
print(dog) # Buddy is 2 years old


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23
🤔 В чем отличие списка от кортежа?

Список (list) в Python — это изменяемая коллекция элементов, что позволяет добавлять, удалять или изменять элементы после создания. Кортеж (tuple) — это неизменяемая коллекция, то есть элементы нельзя изменить после создания. Списки обычно используются для хранения данных, которые могут изменяться, тогда как кортежи полезны для неизменяемых наборов данных, которые должны оставаться неизменными для большей безопасности или производительности. Кортежи также быстрее списков за счёт своей неизменяемости.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥2💊2
🤔 Какие бывают виды тестов?

🚩Виды

🟠Юнит-тесты (Unit Tests)
Юнит-тесты проверяют отдельные модули или функции на правильность их работы. Эти тесты изолированы и проверяют минимальные функциональные блоки программы.
import unittest

def add(a, b):
return a + b

class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)

def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)

if __name__ == '__main__':
unittest.main()


🟠Интеграционные тесты (Integration Tests)
Интеграционные тесты проверяют взаимодействие между различными модулями или компонентами системы, чтобы убедиться, что они работают вместе правильно.
import unittest

class Database:
def connect(self):
return "Connected to database"

class Application:
def __init__(self):
self.db = Database()

def start(self):
return self.db.connect()

class TestApplication(unittest.TestCase):
def test_application_start(self):
app = Application()
self.assertEqual(app.start(), "Connected to database")

if __name__ == '__main__':
unittest.main()


🟠Функциональные тесты (Functional Tests)
Функциональные тесты проверяют конкретные функции и их соответствие требованиям. Эти тесты обычно основаны на спецификациях и проверяют, правильно ли выполняется функция.
def login(username, password):
if username == "admin" and password == "secret":
return "Login successful"
else:
return "Login failed"

class TestLoginFunction(unittest.TestCase):
def test_valid_login(self):
self.assertEqual(login("admin", "secret"), "Login successful")

def test_invalid_login(self):
self.assertEqual(login("user", "password"), "Login failed")

if __name__ == '__main__':
unittest.main()


🟠Системные тесты (System Tests)
Системные тесты проверяют всю систему в целом, проверяя все компоненты и функции вместе в интегрированной среде.
class SystemTest(unittest.TestCase):
def test_system(self):
app = Application()
result = app.start()
self.assertEqual(result, "Connected to database")
self.assertEqual(login("admin", "secret"), "Login successful")

if __name__ == '__main__':
unittest.main()


🟠Приемочные тесты (Acceptance Tests)
Приемочные тесты проверяют систему на соответствие бизнес-требованиям и ожиданиям пользователя. Эти тесты часто проводятся пользователями или командой контроля качества.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13😁1
🤔 Что такое метаклассы?

Метаклассы в Python — это классы, создающие классы. Они являются "классами классов", которые определяют, как создается новый класс. Метаклассы позволяют вмешиваться и изменять поведение класса во время его создания, что полезно для расширенной настройки классов, например, для проверки атрибутов или автоматической регистрации классов в некотором реестре.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥31
🤔 Как был реализовал паттерн 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


Использование декоратора
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 Singleton:
pass

# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) # True


Использование метакласса
class SingletonMeta(type):
_instances = {}

def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(SingletonMeta, cls).__call__(*args, **kwargs)
return cls._instances[cls]

class Singleton(metaclass=SingletonMeta):
pass

# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()

print(singleton1 is singleton2) # True


Использование модуля (встроенная реализация Singleton)
# module_singleton.py
class Singleton:
pass

singleton = Singleton()

# Пример использования
import module_singleton

singleton1 = module_singleton.singleton
singleton2 = module_singleton.singleton

print(singleton1 is singleton2) # True


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что делает декоратор property?

Декоратор `property` в Python используется для создания свойств объекта, что позволяет управлять доступом к атрибутам класса через геттеры, сеттеры и методы удаления. Это делает возможным изменение внутреннего представления данных без изменения интерфейса класса, обеспечивает лучший контроль за доступом и валидацию данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥7
🤔 Как реализуются public метод?

Методы по умолчанию являются публичными (public), что означает, что они доступны из любого места программы. Публичный метод можно вызвать как из других методов того же класса, так и из внешнего кода.

🟠Создание и использование публичного метода
Для создания публичного метода в Python достаточно определить метод внутри класса. Имя метода не должно начинаться с подчеркивания (если не используются дополнительные соглашения о доступе).
class MyClass:
def public_method(self):
print("This is a public method")

# Создание экземпляра класса
obj = MyClass()

# Вызов публичного метода
obj.public_method() # This is a public method


🟠Примеры использования публичных методов
Внутри класса
Публичные методы можно вызывать из других методов того же класса, используя self.
class MyClass:
def public_method(self):
print("This is a public method")

def another_method(self):
print("Calling public_method from another_method")
self.public_method()

# Создание экземпляра класса
obj = MyClass()

# Вызов метода, который вызывает другой публичный метод
obj.another_method()
# Output:
# Calling public_method from another_method
# This is a public method


Внешний вызов
Публичные методы можно вызывать из внешнего кода, создавая экземпляр класса и обращаясь к методу через этот экземпляр.
class MyClass:
def public_method(self):
print("This is a public method")

# Создание экземпляра класса
obj = MyClass()

# Вызов публичного метода
obj.public_method() # This is a public method


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
🤔 Что такое магические методы?

Магические методы в Python — это специальные методы с двойными подчеркиваниями в начале и конце имени (например, `__init__`, `__str__`, `__repr__`). Они предназначены для переопределения операций, которые по умолчанию выполняются для различных типов операций, таких как арифметические операции, операции среза, операции сравнения и другие.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Что такое абстрактный метод ?

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

🚩Характеристики

🟠Отсутствие реализации
Не имеет тела, то есть не содержит кода, реализующего его поведение.
🟠Обязательность переопределения
Классы, наследующие абстрактный класс, обязаны переопределить все его абстрактные методы, иначе они также должны быть объявлены абстрактными.
🟠Абстрактный класс
Могут быть объявлены только в абстрактных классах. Абстрактный класс не может быть инстанцирован напрямую и служит для определения интерфейса для своих подклассов.
from abc import ABC, abstractmethod

class Animal(ABC):
@abstractmethod
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "Woof!"

class Cat(Animal):
def speak(self):
return "Meow!"

# animal = Animal() # Ошибка: Нельзя создать экземпляр абстрактного класса

dog = Dog()
cat = Cat()

print(dog.speak()) # Вывод: Woof!
print(cat.speak()) # Вывод: Meow!

🟠Абстрактный класс Animal
Класс Animal объявлен абстрактным (наследуется от ABC). В классе Animal объявлен абстрактный метод speak, который не имеет реализации.
🟠Классы Dog и Cat
Классы Dog и Cat наследуют от Animal и реализуют метод speak. Если бы они не реализовали метод speak, возникла бы ошибка при попытке создания экземпляра этих классов.
🟠Создание экземпляров
Экземпляры классов Dog и Cat создаются и их методы speak вызываются, возвращая соответствующие строки.

🚩Плюсы

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111