Python | Вопросы собесов
13.8K subscribers
34 photos
1 file
946 links
Download Telegram
📌 Как выражена инкапсуляция в python?

💬 Спрашивают в 3% собеседований

Инкапсуляция — это один из ключевых принципов объектно-ориентированного программирования (ООП), который позволяет скрывать внутренние детали реализации класса и предоставлять доступ только к определённым методам и атрибутам. В Python инкапсуляция реализована посредством использования соглашений об именовании и встроенных механизмов языка. Давайте рассмотрим, как это работает.

🤔 Модификаторы доступа в Python

1️⃣ Публичные атрибуты и методы: Имена атрибутов и методов, которые не начинаются с подчеркивания (_), считаются публичными. Они доступны из любой части программы.

   class MyClass:
def __init__(self, value):
self.value = value # Публичный атрибут

def public_method(self):
return self.value # Публичный метод

obj = MyClass(42)
print(obj.value) # Доступ к публичному атрибуту
print(obj.public_method()) # Вызов публичного метода


2️⃣ Защищённые атрибуты и методы: Имена атрибутов и методов, начинающиеся с одного подчеркивания (_), считаются защищёнными. Это соглашение означает, что они не должны использоваться вне класса или его подклассов.

   class MyClass:
def __init__(self, value):
self._protected_value = value # Защищённый атрибут

def _protected_method(self):
return self._protected_value # Защищённый метод

obj = MyClass(42)
print(obj._protected_value) # Можно получить доступ, но это не рекомендуется
print(obj._protected_method()) # Можно вызвать, но это не рекомендуется


3️⃣ Приватные атрибуты и методы: Имена атрибутов и методов, начинающиеся с двух подчеркиваний (__), считаются приватными. Они не могут быть доступны напрямую из-за механизма "имённая манглинг" (name mangling), который изменяет их имена в целях защиты.

   class MyClass:
def __init__(self, value):
self.__private_value = value # Приватный атрибут

def __private_method(self):
return self.__private_value # Приватный метод

obj = MyClass(42)
# print(obj.__private_value) # Это вызовет ошибку AttributeError
# print(obj.__private_method()) # Это вызовет ошибку AttributeError


🤔 Доступ к приватным атрибутам и методам

Хотя приватные атрибуты и методы не могут быть напрямую доступны, Python позволяет получить к ним доступ через манглинг имён. Python преобразует имя атрибута в формате _ClassName__AttributeName.
class MyClass:
def __init__(self, value):
self.__private_value = value # Приватный атрибут

def __private_method(self):
return self.__private_value # Приватный метод

obj = MyClass(42)
print(obj._MyClass__private_value) # Доступ к приватному атрибуту через манглинг
print(obj._MyClass__private_method()) # Вызов приватного метода через манглинг


🤔 Свойства и инкапсуляция

Для более удобного управления доступом к атрибутам часто используются свойства (properties). Свойства позволяют определить методы доступа (геттеры и сеттеры) для атрибутов, что позволяет реализовать контроль за их изменением и доступом.
class MyClass:
def __init__(self, value):
self.__private_value = value

@property
def value(self):
return self.__private_value

@value.setter
def value(self, new_value):
if new_value >= 0:
self.__private_value = new_value
else:
raise ValueError("Значение должно быть неотрицательным")

obj = MyClass(42)
print(obj.value) # Использование геттера
obj.value = 10 # Использование сеттера
# obj.value = -5 # Это вызовет ошибку ValueError


🤔Кратко:

Инкапсуляция в Python скрывает внутренние детали класса с помощью соглашений об именовании и использования свойств для управления доступом к атрибутам.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
📌 Какие методы в метаклассах используются?

💬 Спрашивают в 3% собеседований

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

1️⃣ `__new__(cls, name, bases, dct)`: Этот метод вызывается перед созданием нового класса. Он отвечает за создание и возвращение нового объекта класса. Здесь можно изменить или дополнить атрибуты и методы класса до его окончательного создания.

2️⃣`__init__(cls, name, bases, dct)`: Этот метод вызывается после создания класса. Он инициализирует класс после его создания, что позволяет изменить его поведение или добавить дополнительную логику.

3️⃣`__call__(cls, *args, **kwargs)`: Этот метод контролирует создание экземпляров класса. Он вызывается, когда создается объект класса. Его можно использовать для изменения процесса создания экземпляров.

4️⃣ `__prepare__(name, bases, **kwds)` (Python 3.3+): Этот метод возвращает словарь, который будет использоваться для определения атрибутов нового класса. Это полезно, если требуется контролировать порядок атрибутов или использовать специализированные словари.

Рассмотрим пример метакласса, который использует некоторые из этих методов.

🤔 Пример использования метаклассов
class MyMeta(type):
def __new__(cls, name, bases, dct):
print(f'Creating class {name}')
dct['class_attribute'] = 'Added by MyMeta'
return super().__new__(cls, name, bases, dct)

def __init__(cls, name, bases, dct):
print(f'Initializing class {name}')
super().__init__(name, bases, dct)

def __call__(cls, *args, **kwargs):
print(f'Creating instance of {cls.__name__}')
instance = super().__call__(*args, **kwargs)
return instance

# Использование метакласса
class MyClass(metaclass=MyMeta):
def __init__(self, value):
self.value = value

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


🤔 Объяснение работы примера

1️⃣ `__new__`: Метод __new__ вызывается при создании класса MyClass. Он добавляет атрибут class_attribute к словарю атрибутов класса и выводит сообщение о создании класса.
2️⃣ `__init__`: Метод __init__ вызывается после создания класса и выводит сообщение об инициализации класса.
3️⃣`__call__`: Метод __call__ вызывается при создании экземпляра класса MyClass. Он выводит сообщение о создании экземпляра и затем вызывает стандартный процесс создания экземпляра, возвращая его.

🤔 Использование `__prepare__`

Метод __prepare__ используется для возврата словаря, который будет использоваться при создании класса. Это может быть полезно для контроля порядка атрибутов или для использования специализированных словарей.
class MyMeta(type):
@classmethod
def __prepare__(cls, name, bases, **kwds):
return {'custom_dict': {}}

def __new__(cls, name, bases, dct):
print(f'Creating class {name} with custom dict')
print(f'Custom dict: {dct["custom_dict"]}')
return super().__new__(cls, name, bases, dct)

# Использование метакласса с __prepare__
class MyClass(metaclass=MyMeta):
def __init__(self, value):
self.value = value

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


🤔 Подводя итог

Метаклассы в Python предоставляют мощный способ изменения поведения классов на разных стадиях их создания и инициализации. Основные методы, используемые в метаклассах, включают __new__, __init__, __call__ и __prepare__.

🤔 Кратко:

Метаклассы используют методы __new__, __init__, __call__ и __prepare__ для изменения поведения классов при их создании и инициализации.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥1
📌 Как можно проверить что объект класса является потомком?

💬 Спрашивают в 3% собеседований

Чтобы проверить, является ли объект экземпляром класса-потомка, в Python можно использовать функцию isinstance(). Эта функция позволяет проверить, принадлежит ли объект определенному классу или является экземпляром класса, который наследует от указанного.

🤔 Пример использования `isinstance()`

Допустим, у нас есть базовый класс Animal и два класса-потомка: Dog и Cat.
class Animal:
pass

class Dog(Animal):
pass

class Cat(Animal):
pass


Теперь создадим объекты этих классов и проверим их принадлежность к классу Animal.
d, c = Dog(), Cat()
print(isinstance(d, Animal)) # True
print(isi)) # True
print(isinstance(d, Dog)) # True
print(isinstance(c, Dog)) # False
print(isinstance(c, Cat)) # True


🤔 Почему `isinstance()`?

1️⃣ Гибкость: isinstance() работает не только с конкретным классом, но и с любым классом, унаследованным от указанного.

2️⃣ Наследование: Позволяет учитывать иерархию классов и проверять, является ли объект экземпляром любого из классов-предков.

3️⃣ Безопасность: Предотвращает ошибки, связанные с неверной идентификацией типа объекта.

🤔 Дополнительный пример

Рассмотрим более сложную иерархию классов:
class Vehicle:
pass

class Car(Vehicle):
pass

class Truck(Vehicle):
pass

class ElectricCar(Car):
pass


Создадим объекты и проверим их принадлежность:
v, c, t, ec = Vehicle(), Car(), Truck(), ElectricCar()
print(isinstance(v, Vehicle)) # True
print(isinstance(c, Vehicle)) # True
print(isinstance(t, Vehicle)) # True
print(isinstance(ec, Vehicle)) # True
print(isinstance(ec, Car)) # True
print(isinstance(ec, ElectricCar)) # True
print(isinstance(c, ElectricCar)) # False


🤔 Краткое объяснение

Для проверки, является ли объект экземпляром класса-потомка, используйте функцию isinstance(). Она проверяет, принадлежит ли объект указанному классу или любому из его предков.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
📌 Что такое diamondproblem?

💬 Спрашивают в 3% собеседований

Проблема ромбовидного наследования (или проблема "алмаза") возникает в языках программирования с поддержкой множественного наследования, таких как Python. Эта проблема связана с неоднозначностью порядка, в котором должны наследоваться методы и атрибуты от родительских классов. Рассмотрим, как эта проблема проявляется и как Python решает её с помощью порядка разрешения методов (MRO).

🤔 Пример проблемы ромбовидного наследования

Предположим, у нас есть четыре класса, организованные в ромбовидную структуру наследования:
class A:
def method(self):
print("Method from A")

class B(A):
def method(self):
print("Method from B")

class C(A):
def method(self):
print("Method from C")

class D(B, C):
pass


Здесь D наследует от B и C, которые, в свою очередь, наследуют от A. Если мы создадим объект класса D и вызовем метод method, возникает вопрос: какой именно метод будет вызван — из класса B или из класса C?

d = D()
d.method() # Какой метод будет вызван?


🤔 Решение в Python: Порядок разрешения методов (MRO)

Python использует алгоритм C3-линеаризации для определения порядка разрешения методов (Method Resolution Order, MRO). Этот алгоритм помогает определить последовательность, в которой классы должны проверяться на наличие методов и атрибутов.

Чтобы увидеть MRO для класса D, можно использовать метод mro():
print(D.mro())


Вывод будет следующим:
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]


Это означает, что при вызове метода method у объекта D, Python сначала проверяет класс D, затем B, затем C и, наконец, A. Таким образом, метод из класса B будет вызван первым.

🤔 Пример вызова метода
d = D()
d.method() # Выведет "Method from B"


🤔 Объяснение алгоритма C3-линеаризации

Алгоритм C3-линеаризации работает следующим образом:
1️⃣ Последовательность класса: Класс и его базовые классы упорядочиваются в список.
2️⃣Сохранение порядка наследования: Базовые классы упорядочиваются так, чтобы сохранить порядок наследования.
3️⃣Решение конфликтов: Если существует неоднозначность, выбирается класс, который появляется первым в последовательности.

🤔 Пример MRO для сложной структуры

Рассмотрим более сложный пример с дополнительным классом E:
class E:
def method(self):
print("Method from E")

class B(E, A):
def method(self):
print("Method from B")

class C(A):
def method(self):
print("Method from C")

class D(B, C):
pass

print(D.mro())


Вывод будет:
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]


🤔 Подводя итог

Проблема ромбовидного наследования возникает из-за неоднозначности порядка наследования методов и атрибутов в множественном наследовании. Python решает эту проблему с помощью алгоритма C3-линеаризации, который определяет порядок разрешения методов (MRO), обеспечивая предсказуемое и логичное поведение.

🤔 Кратко:

Проблема ромбовидного наследования возникает при множественном наследовании из-за неоднозначности порядка наследования методов. Python решает её с помощью алгоритма C3-линеаризации, который определяет порядок разрешения методов (MRO).

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
🤔 Что такое Миксин?

Миксин (Mixin) – это класс, предназначенный для предоставления определённых методов для использования другими классами, без необходимости становиться родительским классом для этих классов. Главная цель миксина - реализация функциональности, которую можно легко подключить к другому классу. Миксины позволяют разработчикам использовать композицию для добавления функций в классы вместо наследования, что делает структуру кода гибче и модульнее.

Ставь 👍 если знал ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34🤯21🔥1🐳1
📌 Что такое cls?

💬 Спрашивают в 3% собеседований

В Python cls — это конвенциональное имя, используемое в методах классов для обозначения самого класса. Оно аналогично self, который используется для обозначения экземпляра класса в методах экземпляра.

🤔 Использование `cls` в методах класса

Методы класса (class methods) — это методы, которые получают сам класс в качестве первого аргумента вместо экземпляра класса. Такие методы определяются с использованием декоратора @classmethod.

🤔 Пример метода класса
class MyClass:
class_attribute = "Классовый атрибут"

def __init__(self, value):
self.instance_attribute = value # Атрибут экземпляра

@classmethod
def class_method(cls):
return cls.class_attribute

# Вызов метода класса
print(MyClass.class_method()) # Вывод: "Классовый атрибут"


🤔 Зачем нужен `cls`

1️⃣Доступ к классовым атрибутам и методам: Используя cls, вы можете получить доступ к атрибутам и методам самого класса.
2️⃣Изменение поведения класса: cls позволяет создавать методы, которые могут работать с классом, а не с конкретным экземпляром, что полезно для задач, связанных с настройкой или инициализацией классовых атрибутов.
3️⃣Создание альтернативных конструкторов: С помощью cls можно создавать альтернативные конструкторы, которые возвращают экземпляры класса различными способами.

🤔 Пример альтернативного конструктора
```python
class MyClass:
def init(self, value):
self.value = value

@classmethod
def from_string(cls, string):
value = int(string)
return cls(value)

Создание экземпляра через альтернативный конструктор
obj = MyClass.from_string("42")
print(obj.value) # Вывод: 42
```

🤔 Различие между `cls` и `self`

`self`: Используется для методов экземпляра. Ссылается на конкретный экземпляр класса, через который вызван метод.
`cls`: Используется для методов класса. Ссылается на сам класс, через который вызван метод.

🤔 Пример различий

class MyClass:
class_attribute = "Классовый атрибут"

def __init__(self, value):
self.instance_attribute = value

@classmethod
def class_method(cls):
return cls.class_attribute

def instance_method(self):
return self.instance_attribute

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

# Вызов метода экземпляра
print(obj.instance_method()) # Вывод: 42

# Вызов метода класса
print(MyClass.class_method()) # Вывод: "Классовый атрибут"


🤔 Подводя итог

cls — это имя, используемое для обозначения самого класса в методах класса, определенных с помощью декоратора @classmethod. Оно позволяет работать с атрибутами и методами класса, а не конкретного экземпляра.

🤔 Кратко:

cls используется в методах класса для обозначения самого класса, как self используется для обозначения экземпляра класса.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍131
Please open Telegram to view this post
VIEW IN TELEGRAM
👍112
Python | Вопросы собесов pinned «👾 1096 собесов на Python Developer 🔒 База реальных собесов 🔒 База тестовых заданий 👾 Список менторов 🖥 Python ├ Вакансии ├ LeetCode ответы └ Тесты 👩‍💻 Java ├ Вопросы собесов ├ Вакансии ├ LeetCode ответы └ Тесты 🖥 Frontend ├ Вопросы собесов ├ Вакансии ├…»
📌 Как в классах хранятся атрибуты и методы?

💬 Спрашивают в 3% собеседований

В Python классы и их экземпляры хранят атрибуты и методы в определённых структурах данных. Понимание этих структур помогает лучше понять, как работают классы и объекты, а также как Python реализует инкапсуляцию и наследование.

🤔 Хранение атрибутов в экземплярах класса

Экземпляры классов хранят свои атрибуты в специальном словаре __dict__. Этот словарь содержит пары ключ-значение, где ключ — это имя атрибута, а значение — его значение.

Пример:
class MyClass:
def __init__(self, value):
self.value = value

obj = MyClass(42)
print(obj.__dict__) # Вывод: {'value': 42}


🤔 Хранение атрибутов и методов в классах

Классы в Python также используют словарь __dict__, чтобы хранить свои атрибуты и методы. Этот словарь доступен через атрибут __dict__ класса и содержит все атрибуты и методы класса.

Пример:
class MyClass:
class_attribute = "Классовый атрибут"

def __init__(self, value):
self.value = value

def method(self):
return "Метод экземпляра"

print(MyClass.__dict__)
# Выводит словарь, содержащий class_attribute, __init__, method и другие служебные атрибуты


🤔 Атрибуты и методы наследуются

Когда вы создаете экземпляр класса, Python сначала проверяет наличие атрибута или метода в экземпляре объекта, а затем в его классе, и далее по цепочке наследования, если атрибут или метод не найден.

Пример наследования:
class Parent:
def method(self):
return "Метод родителя"

class Child(Parent):
pass

child = Child()
print(child.method()) # Вывод: "Метод родителя"


🤔 Порядок поиска атрибутов и методов: MRO

Порядок разрешения методов (MRO) определяет, в каком порядке Python ищет атрибуты и методы. MRO можно получить с помощью метода mro() или атрибута __mro__.

Пример получения MRO:
class A:
pass

class B(A):
pass

class C(A):
pass

class D(B, C):
pass

print(D.mro())
# Вывод: [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]


🤔 Специальные атрибуты класса

`__dict__`: Содержит атрибуты и методы класса или экземпляра.
`__mro__`: Кортеж, показывающий порядок разрешения методов.
`__bases__`: Кортеж базовых классов, от которых наследуется класс.

Пример специальных атрибутов:
class Parent:
pass

class Child(Parent):
pass

print(Child.__bases__) # Вывод: (<class '__main__.Parent'>,)
print(Child.__mro__) # Вывод: (<class '__main__.Child'>, <class '__main__.Parent'>, <class 'object'>)


🤔 Подводя итог

Атрибуты и методы экземпляров класса хранятся в словаре __dict__ экземпляра, а атрибуты и методы самого класса — в словаре __dict__ класса. Наследование и порядок разрешения методов (MRO) определяют, как Python ищет атрибуты и методы в иерархии классов.

🤔Кратко:

Атрибуты экземпляров хранятся в __dict__ объекта, а атрибуты и методы класса — в __dict__ класса. Порядок разрешения методов (MRO) определяет, как Python ищет атрибуты и методы.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5
📌 Чем отличается класс от объекта класса?

💬 Спрашивают в 3% собеседований

🤔 Отличие класса от объекта класса

🤔 Класс

Класс — это шаблон или чертеж для создания объектов. Он определяет набор свойств и методов, которые будут у объектов этого класса. Класс описывает, что должно быть у объектов, но сам по себе не является конкретным экземпляром.
class Dog:
def __init__(self, name):
self.name = name

def bark(self):
return f"{self.name} barks"


В этом примере Dog — это класс, который определяет, что у каждой собаки будет имя и метод bark().

🤔 Объект класса

Объект класса — это конкретный экземпляр класса, созданный на основе его шаблона. Он имеет реальные данные и может выполнять методы, определенные в классе.
my_dog = Dog("Rex")
print(my_dog.bark()) # Выведет: Rex barks


my_dog — это объект класса Dog. Он имеет конкретное имя "Rex" и может выполнять метод bark().

🤔 Основные отличия:

1️⃣ Определение vs. Реализация:
- Класс: Определяет свойства и поведение (методы).
- Объект: Реализует эти свойства и методы с конкретными данными.

2️⃣ Создание:
- Класс: Создается один раз и служит шаблоном.
- Объект: Можно создать множество объектов на основе одного класса.

3️⃣ Статические vs. Динамические:
- Класс: Статичен, определяет общую структуру.
- Объект: Динамичен, хранит конкретное состояние.

🤔 Пример для понимания:
class Car: def __init__(s, m, y): s.m, s.y = m, y
def drive(s): return f"The {s.m} from {s.y} is driving"
c1, c2 = Car("Toyota", 2020), Car("Honda", 2019)
print(c1.drive()) # The Toyota from 2020 is driving
print(c2.drive()) # The Honda from 2019 is driving


- Car — это класс.
- car1 и car2 — это объекты класса Car, каждый из которых имеет свои данные (модель и год выпуска).

🤔 Краткое объяснение

Класс — это шаблон для создания объектов, определяющий свойства и методы. Объект — это конкретный экземпляр класса с реальными данными и функциональностью.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72
🤔 Что такое MRO ?

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

Ставь 👍 если знал ответ и 🔥 если нет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍47🔥213🤔1👀1
📌 Что такое абстракция?

💬 Спрашивают в 3% собеседований

Абстракция — это один из ключевых принципов объектно-ориентированного программирования (ООП), который позволяет упростить сложные системы, скрывая детали их реализации и предоставляя только необходимую функциональность. В Python абстракция достигается через использование классов и интерфейсов, что позволяет разработчикам создавать более понятные и управляемые структуры кода.

🤔 Принцип абстракции

Абстракция позволяет сосредоточиться на том, что делает объект, а не на том, как он это делает. Это достигается путем:

1️⃣ Скрытия внутренней реализации: Пользователи объектов видят только методы и свойства, которые предоставляются классом, но не детали их реализации.
2️⃣Предоставления простого интерфейса: Классы могут предоставлять четко определенные методы, которые обеспечивают взаимодействие с объектами.

🤔 Абстрактные классы и методы в Python

В Python абстракция часто реализуется с использованием абстрактных классов и методов. Абстрактные классы определяются с помощью модуля abc (Abstract Base Classes), а абстрактные методы обозначаются декоратором @abstractmethod.

Пример абстрактного класса
from abc import ABC, abstractmethod

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

@abstractmethod
def move(self):
pass


🤔 Реализация абстрактного класса

Абстрактный класс Animal определяет два абстрактных метода: make_sound и move. Эти методы не имеют реализации и должны быть реализованы в подклассах. Попробуем создать подклассы:
class Dog(Animal):
def make_sound(self):
return "Bark"

def move(self):
return "Run"

class Cat(Animal):
def make_sound(self):
return "Meow"

def move(self):
return "Jump"


Теперь мы можем создать объекты классов Dog и Cat и использовать их методы, не задумываясь о деталях реализации.
dog = Dog()
print(dog.make_sound()) # Вывод: "Bark"
print(dog.move()) # Вывод: "Run"

cat = Cat()
print(cat.make_sound()) # Вывод: "Meow"
print(cat.move()) # Вывод: "Jump"


🤔 Преимущества абстракции

1️⃣ Упрощение сложных систем: Абстракция помогает разбивать сложные системы на более управляемые части.
2️⃣ Повышение читабельности и поддерживаемости кода: Код становится более понятным, так как скрываются ненужные детали реализации.
3️⃣ Снижение зависимости кода: Изменения в реализации не влияют на пользователей класса, что позволяет более гибко изменять и расширять функциональность.

🤔 Подводя итог

Абстракция в ООП позволяет скрывать детали реализации и предоставлять простой интерфейс для взаимодействия с объектами. В Python абстракция достигается через абстрактные классы и методы, которые определяются с использованием модуля abc и декоратора @abstractmethod.

🤔Кратко:

Абстракция скрывает детали реализации и предоставляет простой интерфейс для использования объектов. В Python это реализуется с помощью абстрактных классов и методов.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
🤔 Какое утверждение верно относительно использования декоратора @property в Python?
Anonymous Quiz
11%
@property запрещает изменение значения атрибута
14%
@property позволяет скрыть метод класса от доступа
65%
@property позволяет определить метод, который будет вызываться при доступе к атрибуту
10%
@property используется только для методов, которые возвращают неизменяемые значения
👍6
📌 Какие типы полиморфизма есть в python?

💬 Спрашивают в 3% собеседований

В Python существуют два основных типа полиморфизма: перегрузка методов и наследование и переопределение методов. Давайте рассмотрим каждый из них подробнее.

1️⃣ Перегрузка методов
Перегрузка методов подразумевает использование одного и того же метода с различными типами данных. Однако в Python это реализуется несколько иначе, чем в статически типизированных языках, таких как C++ или Java. В Python отсутствует явная поддержка перегрузки методов. Вместо этого мы можем использовать стандартные функции с переменным числом аргументов.

Пример:
class Math:
def add(self, a, b, c=0):
return a + b + c

math = Math()
print(math.add(2, 3)) # 5
print(math.add(2, 3, 4)) # 9

В этом примере метод add может принимать два или три аргумента, что является примером неявной перегрузки.

2️⃣ Наследование и переопределение методов
Наследование и переопределение методов – это более распространенный и важный аспект полиморфизма в Python. Это когда методы в дочернем классе переопределяют поведение методов в базовом классе.

Пример:
class Animal:
def sound(self):
raise NotImplementedError("Subclass must implement abstract method")

class Dog(Animal):
def sound(self):
return "Woof"

class Cat(Animal):
def sound(self):
return "Meow"

def make_sound(animal):
print(animal.sound())

dog = Dog()
cat = Cat()

make_sound(dog) # Woof
make_sound(cat) # Meow

В этом примере класс Dog и класс Cat переопределяют метод sound базового класса Animal. Функция make_sound вызывает метод sound независимо от конкретного типа объекта.

🤔 Краткий итог:
1️⃣ Перегрузка методов позволяет использовать методы с различным числом аргументов.
2️⃣ Наследование и переопределение методов позволяет дочерним классам реализовывать или изменять поведение методов базового класса.

🔥 ТОП ВОПРОСОВ С СОБЕСОВ

🔒 База собесов | 🔒 База тестовых
Please open Telegram to view this post
VIEW IN TELEGRAM
👍114🐳1💊1