Какие типы полиморфизма есть в Python? Спросят с вероятностью 3%
Полиморфизм — это способность функции, метода или объекта работать с разными типами данных. В Python это включает:
1️⃣ Полиморфизм подтипов (наследование)
2️⃣ Полиморфизм перегрузки (параметрический полиморфизм)
3️⃣ Полиморфизм утиной типизации (по интерфейсу)
### Полиморфизм подтипов (наследование)
Этот тип позволяет использовать объект любого класса, который является подклассом базового класса. Это достигается с помощью наследования. Метод, определенный в базовом классе, может быть переопределен в подклассах.
Python | Вопросы с собеседований
Полиморфизм — это способность функции, метода или объекта работать с разными типами данных. В 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бут
Пример:
Динамическое добавление атрибутов и методов
Атрибуты и методы можно добавлять на dictпляра:
Пример для класса:
В общем, атрибуты и методы экземпляра хранятся в
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 методы обозначаются одним подчёркиванием (_) перед именем метода. Это просто соглашение, которое говорит о том, что метод или атрибут предназначен для внутреннего использования внутри класса и его подклассов. Но на самом деле такие методы и атрибуты можно вызвать и извне, если очень нужно.
Пример:
Что тут происходит:
- _protected_method — это защищенный метод, обозначенный одним подчёркиванием.
- _protected_value — это защищенный атрибут, тоже обозначенный подчёркиванием.
Почему это используется:
1. Соглашение: Одно подчёркивание сигнализирует другим программистам, что метод или атрибут не предназначен для публичного использования.
2. Инкапсуляция: Помогает в организации кода и защите внутренних данных и методов, хоть и не гарантирует строгих ограничений доступа.
3. Наследование: Упрощает работу с подклассами, которые могут использовать защищенные методы и атрибуты.
Правила именования:
- Публичные методы: Нет подчёркиваний в начале имени.
- Защищенные методы: Одно подчёркивание в начале имени (_method).
- Приватные методы: Два подчёркивания в начале имени (__method).
Пример для всех типов методов:
Итог:
Защищенные методы в Python обозначаются одним подчёркиванием перед именем метода. Это означает, что метод предназначен для внутреннего использования в классе и его подклассах, но при желании его можно вызвать и снаружи.
Python | Вопросы с собеседований
Спросят с вероятностью 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 | Вопросы с собеседований
Какой из этих двух классов вызывается первым? Спрашивают с вероятностью 3%.
Когда речь идет о том, какой из классов вызывается первым, предполагается вопрос о порядке вызова конструкторов в иерархии наследования. В Python это определяется MRO (Method Resolution Order), что особенно важно при множественном наследовании.
Пример с двумя классами:
Порядок вызова:
1️⃣ Создавая объект класса
2️⃣ Внутри конструктора
Вывод программы:
То есть, сначала вызывается конструктор
Метод разрешения порядка (MRO):
MRO определяет, в каком порядке обрабатываются классы при наследовании. В Python этот порядок можно увидеть с помощью атрибута
mro
Вывод:
Это показывает, что порядок вызова методов для класса
1️⃣ B
2️⃣ A
3️⃣ object
Пример с множественinitм:
Порядок вызова:
При создании объекта класса
mainе MRO:
Вывод:
Вывод программы:
То есть, порядок вызова конструкторов:
1️⃣ D
2️⃣ B
3️⃣ C
4️⃣ A
Итого:
При создании объекта класса сначала вызывается конструктор самого класса, затем конструкторы его базовых классов в порядке, определённом MRO.
Python | Вопросы с собеседований
Когда речь идет о том, какой из классов вызывается первым, предполагается вопрос о порядке вызова конструкторов в иерархии наследования. В Python это определяется MRO (Method Resolution Order), что особенно важно при множественном наследовании.
Пример с двумя классами:
class A:
def __init__(self):
print("Constructor of A")
class B(A):
def __init__(self):
print("Constructor of B")
super().__init__()
Создание экземпляра класса B
b = B()
Порядок вызова:
1️⃣ Создавая объект класса
B
, сначала вызinitтор __init__
.2️⃣ Внутри конструктора
B
, вызов super().__init__()
вызывает конструктор базового класса A
.Вывод программы:
Constructor of B
Constructor of A
То есть, сначала вызывается конструктор
B
, а затем A
.Метод разрешения порядка (MRO):
MRO определяет, в каком порядке обрабатываются классы при наследовании. В Python этот порядок можно увидеть с помощью атрибута
mro
или функции mro()
.mro
print(B.__mro__)
Вывод:
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
Это показывает, что порядок вызова методов для класса
B
такой:1️⃣ B
2️⃣ A
3️⃣ object
Пример с множественinitм:
class A:
def __init__(self):
print("Constructor of A")
class B(A):
def __init__(self):
print("Constructor of B")
super().__init__()
class C(A):
def __init__(self):
print("Constructor of C")
super().__init__()
class D(B, C):
def __init__(self):
print("Constructor of D")
super().__init__()
Создание экземпляра класса D
d = D()
Порядок вызова:
При создании объекта класса
D
вызовы кmroоисхоmroласно MRO для D
.mainе MRO:
print(D.__mro__)
Вывод:
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
Вывод программы:
Constructor of D
Constructor of B
Constructor of C
Constructor of A
То есть, порядок вызова конструкторов:
1️⃣ D
2️⃣ B
3️⃣ C
4️⃣ A
Итого:
При создании объекта класса сначала вызывается конструктор самого класса, затем конструкторы его базовых классов в порядке, определённом MRO.
Python | Вопросы с собеседований
Как в Python делать приватные методы?
Спросят с вероятностью 3%
Приватные методы в Python делаются с помощью двойного подчёркивания (__) перед именем метода. Это включает механизм "name mangling", который делает метод менее доступным снаружи класса, добавляя к имени метода имя класса.
Пример:
Что тут происходит:
- Метод
Доступ к приватным методам
Хотя приватные методы скрыты, их всё же можно вызвать с помощью name mangling:
Почему они нужны
1️⃣ Инкапсуляция: Помогают скрывать внутреннюю реализацию класса и защищают данные и методы от несанкционированного доступа и изменения.
2️⃣ Упрощение интерфейса: Скрывая детали реализации, приватные методы позволяют сосредоточиться на использовании класса через его публичный интерфейс.
3️⃣ Предотвращение конфликтов имён: Приватные методы уменьшают вероятность конфликтов имён при наследовании классов.
Правила именования
- Публичные методы: Нет подчёркиваний в начале имени.
- Защищённые методы: Одно подчёркивание в начале имени (_method).
- Приватные методы: Два подчёркивания в начале имени (__method).
Пример для всех типов методов:
Приватные методы в Python делаются с помощью двойного подчёркивания перед именем метода. Это помогает скрывать методы и защищать данные, хотя полностью не предотвращает доступ к ним.
Python | Вопросы с собеседований
Спросят с вероятностью 3%
Приватные методы в Python делаются с помощью двойного подчёркивания (__) перед именем метода. Это включает механизм "name mangling", который делает метод менее доступным снаружи класса, добавляя к имени метода имя класса.
Пример:
class MyClass:
def __init__(self, value):
self.value = value
def __private_method(self):
print(f"Private method: The value is {self.value}")
def public_method(self):
self.__private_method()
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: Private method: The value is 10
# Прямой вызов приватного метода приведёт к ошибке
# obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method'
Что тут происходит:
- Метод
__private_method
является приватным и не может быть вызван напрямую извне класса.Доступ к приватным методам
Хотя приватные методы скрыты, их всё же можно вызвать с помощью name mangling:
# Доступ к приватному методу через name mangling
obj._MyClass__private_method() # Выведет: Private method: The value is 10
Почему они нужны
1️⃣ Инкапсуляция: Помогают скрывать внутреннюю реализацию класса и защищают данные и методы от несанкционированного доступа и изменения.
2️⃣ Упрощение интерфейса: Скрывая детали реализации, приватные методы позволяют сосредоточиться на использовании класса через его публичный интерфейс.
3️⃣ Предотвращение конфликтов имён: Приватные методы уменьшают вероятность конфликтов имён при наследовании классов.
Правила именования
- Публичные методы: Нет подчёркиваний в начале имени.
- Защищённые методы: Одно подчёркивание в начале имени (_method).
- Приватные методы: Два подчёркивания в начале имени (__method).
Пример для всех типов методов:
class MyClass:
def __init__(self, value):
self.value = value
def public_method(self):
print(f"Public method: The value is {self.value}")
def _protected_method(self):
print(f"Protected method: The value is {self.value}")
def __private_method(self):
print(f"Private method: The value is {self.value}")
def access_private_method(self):
self.__private_method()
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: Public method: The value is 10
# Вызов защищённого метода (можно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 10
# Вызов приватного метода напрямую приведёт к ошибке
# obj.__private_method() # AttributeError
# Вызов приватного метода через публичный метод
obj.access_private_method() # Выведет: Private method: The value is 10
# Доступ к приватному методу через name mangling
obj._MyClass__private_method() # Выведет: Private method: The value is 10
Приватные методы в Python делаются с помощью двойного подчёркивания перед именем метода. Это помогает скрывать методы и защищать данные, хотя полностью не предотвращает доступ к ним.
Python | Вопросы с собеседований
Какой метод используется для добавления элемента в конец списка?
Anonymous Quiz
80%
A) append()
10%
B) insert()
0%
C) add()
10%
D) extend()
Что такое cls?
Спросят с вероятностью 3%
cls — это общепринятое имя для первого параметра в методах класса. Работает так же, как self в методах экземпляра. Но если self ссылается на конкретный объект класса, то cls ссылается на сам класс.
Методы класса
Методы класса получают сам класс в качестве первого аргумента. Для их создания используют декоратор classmethod.
Пример:
В этом примере:
- MyClass имеет переменную класса class_variable и метод класса class_method.
- class_method использует cls для доступа и изменения переменной класса.
Почему он используется
1. Доступ к атрибутам класса: Методы класса могут изменять состояние всего класса, а не конкретного экземпляра.
2. Альтернативные конструкторы: Полезен для создания дополнительных способов инициализации объектов.
Пример:
В этом примере:
- Метод класса from_birth_year использует cls для создания нового объекта Person, рассчитывая возраст на основе года рождения.
Итого
cls используется в методах класса для ссылки на сам класс. Он позволяет методам класса изменять состояние класса и создавать альтернативные конструкторы.
Python | Вопросы с собеседований
Спросят с вероятностью 3%
cls — это общепринятое имя для первого параметра в методах класса. Работает так же, как self в методах экземпляра. Но если self ссылается на конкретный объект класса, то cls ссылается на сам класс.
Методы класса
Методы класса получают сам класс в качестве первого аргумента. Для их создания используют декоратор classmethod.
Пример:
class MyClass:
class_variable = 0
def __init__(self, value):
self.instance_variable = value
@classmethod
def class_method(cls, increment):
cls.class_variable += increment
print(f"Class variable is now {cls.class_variable}")
# Создание экземпляров
obj1 = MyClass(1)
obj2 = MyClass(2)
# Вызов метода класса
MyClass.class_method(5) # Выведет: Class variable is now 5
obj1.class_method(3) # Выведет: Class variable is now 8
obj2.class_method(2) # Выведет: Class variable is now 10
В этом примере:
- MyClass имеет переменную класса class_variable и метод класса class_method.
- class_method использует cls для доступа и изменения переменной класса.
Почему он используется
1. Доступ к атрибутам класса: Методы класса могут изменять состояние всего класса, а не конкретного экземпляра.
2. Альтернативные конструкторы: Полезен для создания дополнительных способов инициализации объектов.
Пример:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
age = 2024 - birth_year
return cls(name, age)
# Создание объектов с использованием альтернативного конструктора
person1 = Person("Alice", 30)
person2 = Person.from_birth_year("Bob", 1990)
print(person1.name, person1.age) # Выведет: Alice 30
print(person2.name, person2.age) # Выведет: Bob 34
В этом примере:
- Метод класса from_birth_year использует cls для создания нового объекта Person, рассчитывая возраст на основе года рождения.
Итого
cls используется в методах класса для ссылки на сам класс. Он позволяет методам класса изменять состояние класса и создавать альтернативные конструкторы.
Python | Вопросы с собеседований
Как реализовать публичный метод в Python?
Спросят с вероятностью 3%
В Python методы по умолчанию публичные. Это значит, что их можно вызывать из любого места, где доступен объект класса. Публичные методы позволяют взаимодействовать с объектом и выполнять действия или получать данные.
Пример:
В этом примере метод public_method является публичным, потому что он определён без специальных модификаторов и доступен извне.
Как отличить публичные методы
Обычно используются следующие соглашения по именованию:
1. Публичные методы: не имеют подчёркиваний в начале имени.
2. Защищённые методы: одно подчёркивание в начале имени (например, _method).
3. Приватные методы: два подчёркивания в начале имени (например, __method).
Пример для всех типов методов:
Почему использовать публичные методы
1. Интерфейс для взаимодействия: Публичные методы позволяют пользователям класса выполнять действия или получать данные.
2. Инкапсуляция: Они скрывают внутреннюю реализацию класса, предоставляя только необходимые методы.
Итого
Публичные методы доступны для вызова из любого места. Они предоставляют интерфейс для взаимодействия с объектом и обычно не имеют подчёркиваний в начале имени.
Python | Вопросы с собеседований
Спросят с вероятностью 3%
В Python методы по умолчанию публичные. Это значит, что их можно вызывать из любого места, где доступен объект класса. Публичные методы позволяют взаимодействовать с объектом и выполнять действия или получать данные.
Пример:
class MyClass:
def __init__(self, value):
self.value = value
def public_method(self):
print(f"The value is {self.value}")
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: The value is 10
В этом примере метод public_method является публичным, потому что он определён без специальных модификаторов и доступен извне.
Как отличить публичные методы
Обычно используются следующие соглашения по именованию:
1. Публичные методы: не имеют подчёркиваний в начале имени.
2. Защищённые методы: одно подчёркивание в начале имени (например, _method).
3. Приватные методы: два подчёркивания в начале имени (например, __method).
Пример для всех типов методов:
class MyClass:
def __init__(self, value):
self.value = value
def public_method(self):
print(f"Public method: The value is {self.value}")
def _protected_method(self):
print(f"Protected method: The value is {self.value}")
def __private_method(self):
print(f"Private method: The value is {self.value}")
def access_private_method(self):
self.__private_method()
# Создание экземпляра класса
obj = MyClass(10)
# Вызов публичного метода
obj.public_method() # Выведет: Public method: The value is 10
# Вызов защищённого метода (можно, но не рекомендуется)
obj._protected_method() # Выведет: Protected method: The value is 10
# Прямой вызов приватного метода приведёт к ошибке
# obj.__private_method() # AttributeError
# Вызов приватного метода через публичный метод
obj.access_private_method() # Выведет: Private method: The value is 10
Почему использовать публичные методы
1. Интерфейс для взаимодействия: Публичные методы позволяют пользователям класса выполнять действия или получать данные.
2. Инкапсуляция: Они скрывают внутреннюю реализацию класса, предоставляя только необходимые методы.
Итого
Публичные методы доступны для вызова из любого места. Они предоставляют интерфейс для взаимодействия с объектом и обычно не имеют подчёркиваний в начале имени.
Python | Вопросы с собеседований
Какой из следующих вариантов создаст словарь (dictionary) с тремя ключами и соответствующими значениями?
Anonymous Quiz
17%
A) my_dict = {1, 2, 3}
83%
B) my_dict = {1: 'a', 2: 'b', 3: 'c'}
0%
C) my_dict = [1, 2, 3]
0%
D) my_dict = (1, 2, 3)
Очередное видео по супер важной теме - сети. Советую каждому веб разработчику разобраться в сетях, этот ролик вам 100% поможет
Str (IT-Community)
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
КАК РАБОТАЕТ WIFI?
Погрузись в дата-инжиниринг на курсе «Data-инженер» от Слёрм. Старт потока – 14 октября. Промокод на скидку 10%: alek10data
Занять место на потоке: https://to.slurm.io/f19_Tw.
Новости дата-реалити, полезные плюшки, подробности о курсе и запись на бесплатный…
Занять место на потоке: https://to.slurm.io/f19_Tw.
Новости дата-реалити, полезные плюшки, подробности о курсе и запись на бесплатный…
Привет друзья! На связи Str - админ паблика
Мои каналы на данный момент:
🚬 Str (IT-Community) — Мой личный канал, в котором я делюсь своей жизнью, как разработчика, публикую материал по интересным технологиям, как по Frontend, так и по Backend разработке.👩💻 Str Frontend (IT-Community) — Канал посвящённый исключительно Frontend разработке. Тесты, статьи, обучающие видео и тд по js, react и другим инструментам Frontend разработчика👩💻 Str Backend (IT-Community) — Канал посвящённый исключительно Backend разработке. Тесты, статьи, обучающие видео и тд по различным Backend языкам программирования. Разбор актуальных инструментов, трендов Backend разработки👩💻 Str Code (IT-Community) — Канал общей направленности для программистов всех сфер.
╞ #Курсы — бесплатные курсы
╞ #Инструменты — библиотеки/фреймворки
╞ #Статьи — статьи
╞ #Тесты — практические тесты
╞ #Новости — новости из мира Backend`a
╞ #Видео — обучающие видео
╘ #Собеседования — записи собеседований
Please open Telegram to view this post
VIEW IN TELEGRAM