(хотя по логике в строках 74-77 тоже должны быть ошибки ведь это объекты не класса Soldier а класса Infantry и Cavalry) from abc import ABC, abstractmethod
Ошибка в 78-й строке кода возникает потому, что класс Pilot не является наследником класса Soldier. В строках 74-77 также создаются объекты, которые не являются классами Soldier, но ошибки не возникают потому, что в методе Army.add_soldier выполняется проверка с использованием статического метода Soldier.validatesoldier(obj), который вызывает исключение, если переданный объект не является экземпляром класса Soldier. Это обеспечивает типовую безопасность и предотвращает добавление объектов, не соответствующих ожидаемому типу.
В случае строки army.add_soldier(Pilot()) объект Pilot не проходит проверку в методе Army.add_soldier и вызывает ошибку. Чтобы избежать этой ошибки, класс Pilot должен быть изменен таким образом, чтобы он наследовался от класса Soldier.
потому что класс Pilot не является подклассом класса Soldier. Метод validatesoldier(obj) в классе Soldier проверяет, что объект, переданный в качестве аргумента, является экземпляром класса Soldier или его подкласса.
В данном случае, класс Pilot не является подклассом класса Soldier, поэтому вызов Soldier.validatesoldier(soldier) для объекта Pilot() приводит к возникновению исключения TypeError.
Чтобы избежать этой ошибки, необходимо либо создать подкласс Pilot, который будет наследоваться от класса Soldier и реализовывать его абстрактные методы, либо изменить логику таким образом, чтобы Pilot был совместим с интерфейсом Soldier.
from abc import ABC, abstractmethod
class Soldier(ABC):
@staticmethod
def validatesoldier(obj):
if not isinstance(obj, Soldier):
raise TypeError('Объектом должен быть Soldier')
@abstractmethod
def move(self):
pass
@abstractmethod
def attack(self):
pass
@abstractmethod
def defend(self):
pass
class Infantry(Soldier):
def move(self):
print('Пехота передвигается в пешем порядке')
def attack(self):
print('Пехота участвует в ближнем бою')
def defend(self):
print('Пехота держит строй')
class Cavalry(Soldier):
def move(self):
print('Кавалерия передвигается верхом')
def attack(self):
print('Кавалерия переходит в атаку')
def attack(self):
for soldat in Army.soldats:
soldat.move()
soldat.attack()
def defend(self):
for soldat in Army.soldats:
soldat.move()
soldat.defend()
army = Army()
army.add_soldier(Infantry())
army.add_soldier(Cavalry())
army.add_soldier(Infantry())
army.add_soldier(Cavalry())
army.add_soldier(Pilot()) # Теперь добавление объекта Pilot не вызывает ошибку