Python: задачки и вопросы
7.76K subscribers
1.19K photos
1 video
1 file
89 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Речь идет о так называемом ромбовидном наследовании и принципе MRO (Method Resolution Order).

Марк Лутц, «Изучаем Python», том 2, гл. 32:

«Путь поиска при наследовании в ромбовидных схемах выполняется больше в манере сначала в ширину ~ Python сначала ищет в любых суперклассах справа от только что просмотренного и только потом поднимается к общему суперклассу вверху. Другими словами, поиск проходит по уровням, прежде чем двигаться вверх.

...

class A: attr = 1 # Обычный класс

class B(A): pass # В и С ведут к А
class С(A): attr = 2
class D(B, С): pass # Проверяет С перед А

х = D()
print(х.attr) # Ищет в х, D, В, С

Атрибут x.attr обнаруживается в суперклассе А, потому что в классических классах
поиск при наследовании поднимается настолько высоко, насколько может, прежде
чем остановиться и начать движение вправо».
👍4👎1
🪤 Что выведет код?
Anonymous Quiz
35%
1
11%
2
23%
3
31%
Error
👎2👍1
Здесь речь также идет о принципе MRO (см. предыдущую задачу).

x = D() # создаем экземпляр класса D, но НЕ вызываем никаких методов

Метод meth() содержит print('C.meth'), но этот print() выполняется только при вызове метода.
🧩 Что выведет код?
Anonymous Quiz
38%
1000
13%
None
1%
[]
48%
Error
👍2👎1
Документация Python:

«object.__slots__
...__slots__ резервирует место для объявленных переменных и предотвращает автоматическое создания dict и weakref для каждого экземпляра».

В задаче выше мы «зафиксировали» список атрибутов и не допускаем добавление ape.

Средство слотов задумывалось как способ отлавливания опечаток.
👍5👎1
🪤 Что выведет код?
Anonymous Quiz
26%
{'a': 1, 'b': 2}
18%
{'b': 2}
6%
{}
49%
Error
🤯2👍1👎1
Задача выше тоже относится к теме слотов.

Что происходит:
1. Класс C - пустой базовый класс
2. Класс D наследует от C и имеет __slots__ = ['a'] - это означает, что экземпляры класса D могут иметь только атрибут a
3. X = D() - создается экземпляр класса D
4. X.a = 1 - устанавливается атрибут a (разрешенный слот)
5. X.b = 2 - устанавливается атрибут b (НЕ разрешенный слот)

Почему же в __dict__ только {'b': 2}? Когда вы используете, атрибуты, указанные в __slots__ (в данном случае a) хранятся в специальной структуре данных, а не в __dict__. Атрибуты, НЕ указанные в __slots__ (в данном случае b) хранятся в __dict__ как обычно.
2👍2👎1🤨1
Из документации Python:

«
@staticmethod
Преобразует метод в статический. Такой метод не получает неявного первого аргумента:

class C:
@staticmethod
def f(arg1, arg2, argN): ...

Форма
@staticmethod представляет собой декоратор функции.

Статический метод может быть вызван как для класса (например, C.f()), так и для экземпляра (например, C().f())».

Декораторы позволяют расширять и изменять поведение вызываемых объектов (функций, методов и классов) без постоянного изменения самого вызываемого объекта.
1👍1👎1
🧩 Какого типа исключения не существует?
Anonymous Quiz
14%
SystemError
10%
ModuleNotFoundError
25%
StopIteration
51%
Все существуют
2
Из документации Python:

«SystemError: Возникает, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не выглядит настолько серьезной, чтобы заставить его потерять всякую надежду».

«ModuleNotFoundError: Подкласс ImportError, который возникает при импорте, когда модуль не может быть найден».

«StopIteration: Вызывается встроенной функцией next() и методом итератора __next__(), чтобы сигнализировать об отсутствии дальнейших созданных итератором элементов».
👍3👎1
🪤 Что выведет код?
Anonymous Quiz
10%
1
33%
2
51%
3
7%
Error
Марк Лутц, «Изучаем Python», том 2, гл. 32:

«class С:
def act(self):
print('spam')

class E(С):
def method(self): # self подразумевается в super
proxy = super() # Эта форма не имеет смысла вне метода
print(proxy) # Вывод обычно скрытого промежуточного объекта
proxy.act() # Аргументы отсутствуют: неявно вызывает метод суперкласса

print(E().method())»

Пошагово:
1. E().method() создает экземпляр класса E и вызывает его метод method()
2. Внутри method():
- Создается proxy = super() (объект super)
- Выводится print(proxy) → <super: <class 'E'>, <E object>>
- Вызывается proxy.act() → выводится spam
3. Метод method() завершается без return, поэтому возвращает None
Из документации Python:

«
@classmethod преобразует метод в метод класса, что получает класс в качестве неявного первого аргумента, точно так же, как метод экземпляра получает экземпляр».

В данном случае преимущества такие:
- Гибкость - разные способы создания объектов
- Читаемость - from_string явно показывает источник
- Наследование - если создать подкласс, cls автоматически будет указывать на него