Str Code (IT-Community)
586 subscribers
30 photos
4 videos
110 links
Наше комьюнити: https://t.iss.one/strc0mmunity
Связь: @strrrrr1
Download Telegram
Channel created
Какие типы полиморфизма есть в Python? Спросят с вероятностью 3%

Полиморфизм — это способность функции, метода или объекта работать с разными типами данных. В Python это включает:

1️⃣ Полиморфизм подтипов (наследование)
2️⃣ Полиморфизм перегрузки (параметрический полиморфизм)
3️⃣ Полиморфизм утиной типизации (по интерфейсу)

### Полиморфизм подтипов (наследование)

Этот тип позволяет использовать объект любого класса, который является подклассом базового класса. Это достигается с помощью наследования. Метод, определенный в базовом классе, может быть переопределен в подклассах.

class Animal:
def make_sound(self):
pass

class Dog(Animal):
def make_sound(self):
return "Bark"

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

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


Python | Вопросы с собеседований
Как в классах хранятся атрибуты и методы?
Спросят с вероятностью 3%

Атрибуты и методы в классах хранятся в специальном словаре под названием __dict__. Этот словарь содержит все данные и функции экземпляра или класса.

Атрибуты и методы экземпляра

Когда создаешь объект класса, для него создается свой собственный словарь атрибутов, где хранятся все данные, относящиеся к этому объекту.

Пример:
class MyClass:
class_attr = 42

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

def instance_method(self):
return f"Instance attribute: {self.instance_attr}"

@classmethod
def class_method(cls):
return f"Class attribute: {cls.class_attr}"

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

# Доступ к словарю атрибутов экземпляра
print(obj.__dict__) # {'instance_attr': 10}

# Доступ к атрибуту экземпляра
print(obj.instance_attr) # 10

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

Атрибуты и методы класса

Они хранятся в словаре сdictбут __dict__.

Пример:
# Доступ к словарю атрибутов класса
print(MyClass.__dict__)

# Что-то вроде этого:
# {
# '__module__': '__main__',
# 'class_attr': 42,
# '__init__': <function MyClass.__init__ at 0x...>,
# 'instance_method': <function MyClass.instance_method at 0x...>,
# 'class_method': <classmethod object at 0x...>,
# '__dict__': <attribute '__dict__' of 'MyClass' objects>,
# '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
# '__doc__': None
# }

# Доступ к атрибуту класса
print(MyClass.class_attr) # 42

# Вызов метода класса
print(MyClass.class_method()) # Class attribute: 42

Динамическое добавление атрибутов и методов

Атрибуты и методы можно добавлять на dictпляра:
obj.new_attr = "I am new!"
print(obj.__dict__) # {'instance_attr': 10, 'new_attr': 'I am new!'}
print(obj.new_attr) # I am new!

Пример для класса:
def new_class_method(cls):
return "This is a new class method"

MyClass.new_class_method = classmethod(new_class_method)

print(MyClass.new_class_method()) # This is a new class method

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

Python | Вопросы с собеседований
Как в Python реализовать protected метод?
Спросят с вероятностью 3%

В Python protected методы обозначаются одним подчёркиванием (_) перед именем метода. Это просто соглашение, которое говорит о том, что метод или атрибут предназначен для внутреннего использования внутри класса и его подклассов. Но на самом деле такие методы и атрибуты можно вызвать и извне, если очень нужно.

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

def _protected_method(self):
print(f"Protected method: The value is {self._protected_value}")

def public_method(self):
self._protected_method()

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

# Вызов публичного метода
obj.public_method() # Выведет: Protected method: The value is 10

# Вызов защищенного метода напрямую (возможно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 10

Что тут происходит:
- _protected_method — это защищенный метод, обозначенный одним подчёркиванием.
- _protected_value — это защищенный атрибут, тоже обозначенный подчёркиванием.

Почему это используется:
1. Соглашение: Одно подчёркивание сигнализирует другим программистам, что метод или атрибут не предназначен для публичного использования.
2. Инкапсуляция: Помогает в организации кода и защите внутренних данных и методов, хоть и не гарантирует строгих ограничений доступа.
3. Наследование: Упрощает работу с подклассами, которые могут использовать защищенные методы и атрибуты.

Правила именования:
- Публичные методы: Нет подчёркиваний в начале имени.
- Защищенные методы: Одно подчёркивание в начале имени (_method).
- Приватные методы: Два подчёркивания в начале имени (__method).

Пример для всех типов методов:
class MyClass:
def __init__(self, value):
self.value = value
self._protected_value = value * 2
self.__private_value = value * 3

def public_method(self):
print(f"Public method: The value is {self.value}")
self._protected_method()
self.__private_method()

def _protected_method(self):
print(f"Protected method: The value is {self._protected_value}")

def __private_method(self):
print(f"Private method: The value is {self.__private_value}")

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

# Вызов публичного метода
obj.public_method()
# Выведет:
# Public method: The value is 10
# Protected method: The value is 20
# Private method: The value is 30

# Вызов защищенного метода напрямую (возможно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 20

# Прямой вызов приватного метода приведёт к ошибке
# obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method'

# Доступ к приватному методу через name mangling
obj._MyClass__private_method() # Выведет: Private method: The value is 30

Итог:
Защищенные методы в Python обозначаются одним подчёркиванием перед именем метода. Это означает, что метод предназначен для внутреннего использования в классе и его подклассах, но при желании его можно вызвать и снаружи.

Python | Вопросы с собеседований