Модуль 1.6 Наследование классов
Какие числа будут выведены в результате выполнения данного кода?
class Base: def __init__(self): self.val = 0 def add_one(self): self.val += 1 def add_many(self, x): for i in range(x): self.add_one() class Derived(Base): def add_one(self): self.val += 10 a = Derived() a.add_one() b = Derived() b.add_many(3) print(a.val) print(b.val)Описание:
Создается объектa
классаDerived
.
Вызывается методadd_one
у объектаa
. Этот метод в классеDerived
переопределен и увеличиваетval
на 10.
Создается объектb
классаDerived
.
Вызывается методadd_many(3)
у объектаb
. Этот метод в классеBase
добавляет единицу три раза, вызывая методadd_one
из классаDerived
, который увеличиваетval
на 10 каждый раз.
10, 30
Что будет выведено в результате выполнения данного кода?
class A: def foo(self): print("A") class B(A): pass class C(A): def foo(self): print("C") class D: def foo(self): print("D") class E(B, C, D): pass E().foo()Описание:
При выполнении данного кода будет вызван методfoo
классаC
, так как классE
наследует от классовB
,C
, иD
в таком порядке. Когда методfoo
вызывается у объектаE()
, Python будет искать методfoo
в классеE
, затем в классеB
(по порядку), затем в классеC
(который переопределяет методfoo
), и, наконец, в классеD
.
C
Рассмотрим следующее объявление классов
class A: pass class B(A): pass class C: pass class D(C): pass class E(B, C, D): passКакие последовательности могут являться корректным порядком разрешения методов для класса E?
Никакие из перечисленных
Вам дано описание наследования классов в следующем формате.
<имя класса 1> : <имя класса 2> <имя класса 3> … <имя класса k>
Это означает, что класс 1 отнаследован от класса 2, класса 3, и т. д.
Или эквивалентно записи:class Class1(Class2, Class3 ... ClassK): passКласс A является прямым предком класса B, если B отнаследован от A:
class B(A): passВам необходимо отвечать на запросы, является ли один класс предком другого класса
Описание:
Данный код решает задачу проверки наследования классов. Вот шаги, которые выполняет программа:
Считывает количество классовn
.
Создает словарьparents
, который будет хранить информацию о том, от каких классов наследуется каждый класс. Проходит по каждому классу и сохраняет его родителей в словаре.
Определяет функциюis_parent(child, parent)
, которая рекурсивно проверяет, является ли один класс предком другого. Если имя ребенка совпадает с именем родителя, возвращаетTrue
. Иначе рекурсивно проверяет каждого родителя ребенка, чтобы убедиться, что родитель является предком.
Считывает количество запросовq
.
Обрабатывает каждый запрос, считывая имена двух классов — ребенка и предка. Затем выводит «Yes», если предок является предком ребенка, и «No» в противном случае.
Код моделирует отношения наследования классов и проверяет, является ли один класс предком другого на основе предоставленных данных.
# Ввод количества классов n = int(input()) # Словарь для хранения родителей каждого класса parents = {} # Считывание описания наследования классов for _ in range(n): a = input().split() # Если класс не наследуется от других, добавляем пустой список в качестве родителей parents[a[0]] = [] if len(a) == 1 else a[2:] # Функция для проверки, является ли один класс предком другого def is_parent(child, parent): if child == parent: return True # Рекурсивно проверяем каждого родителя ребенка for p in parents[child]: if is_parent(p, parent): return True return False # Ввод количества запросов q = int(input()) # Обработка запросов for _ in range(q): # Считывание имен классов из запроса child, parent = input().split() # Вывод "Yes", если parent является предком child, и "No" в противном случае print("Yes" if is_parent(parent, child) else "No")
Реализуйте структуру данных, представляющую собой расширенную структуру стек. Необходимо поддерживать добавление элемента на вершину стека, удаление с вершины стека, и необходимо поддерживать операции сложения, вычитания, умножения и целочисленного деления.
Операция сложения на стеке определяется следующим образом. Со стека снимается верхний элемент (top1), затем снимается следующий верхний элемент (top2), и затем как результат операции сложения на вершину стека кладется элемент, равный top1 + top2.
Аналогичным образом определяются операции вычитания (top1 — top2), умножения (top1 * top2) и целочисленного деления (top1 // top2).
Реализуйте эту структуру данных как класс ExtendedStack, отнаследовав его от стандартного класса list.
Описание:
Этот код определяет классExtendedStack
, который является наследником стандартного классаlist
в Python. Класс расширяет функциональность обычного стека, добавляя четыре метода:sum
,sub
,mul
иdiv
.
Методsum
извлекает два верхних элемента из стека, складывает их, и затем добавляет результат обратно в стек.
Методsub
аналогично извлекает два верхних элемента, вычитает верхний элемент из следующего верхнего элемента, и добавляет результат в стек.
Методmul
умножает два верхних элемента, а затем добавляет результат в стек.
Методdiv
целочисленно делит следующий верхний элемент на верхний элемент, и результат добавляется обратно в стек.
Таким образом, этот класс предоставляет функциональность для выполнения арифметических операций на вершинах стека.
class ExtendedStack(list): def sum(self): top1 = self.pop() top2 = self.pop() result = top1 + top2 self.append(result) def sub(self): top1 = self.pop() top2 = self.pop() result = top1 - top2 self.append(result) def mul(self): top1 = self.pop() top2 = self.pop() result = top1 * top2 self.append(result) def div(self): top1 = self.pop() top2 = self.pop() result = top1 // top2 self.append(result)
Одно из применений множественного наследование – расширение функциональности класса каким-то заранее определенным способом. Например, если нам понадобится логировать какую-то информацию при обращении к методам класса.
Рассмотрим класс Loggable:
import time class Loggable: def log(self, msg): print(str(time.ctime()) + ": " + str(msg))У него есть ровно один метод log, который позволяет выводить в лог (в данном случае в stdout) какое-то сообщение, добавляя при этом текущее время.
Реализуйте класс LoggableList, отнаследовав его от классов list и Loggable таким образом, чтобы при добавлении элемента в список посредством метода append в лог отправлялось сообщение, состоящее из только что добавленного элемента.
Описание:
Этот код определяет класс с именемLoggableList
, который наследуется от двух других классов:list
и (предположительно)Loggable
. Однако, по вашему примечанию, классLoggable
не должен быть включен в код, так что это создает противоречие.
В теле класса определен методappend
, который переопределяет методappend
из базового классаlist
. Внутри методаappend
вызывается методlog(i)
, который предположительно должен быть унаследован от классаLoggable
. Это может вызвать ошибку, так как классLoggable
не был определен в предоставленном коде.
class LoggableList(list, Loggable): def append(self, i): super().append(i) self.log(i)
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы