Вопрос Python, помогите пожалуйста

Регистрация
12 Июл 2013
Сообщения
77
Репутация
10
Спасибо
0
Монет
0
почему ошибка в 78-ой строчке кода?

(хотя по логике в строках 74-77 тоже должны быть ошибки ведь это объекты не класса Soldier а класса Infantry и Cavalry) 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 defend(self):

print('Кавалерия защищает фланги')



class Army():



soldats = []

def add_soldier(self, soldier):

Soldier.validatesoldier(soldier)

Army.soldats.append(soldier)



def attack(self):

for soldat in Army.soldats:

soldat.move()

soldat.attack()



def defend(self):

for soldat in Army.soldats:

soldat.move()

soldat.defend()







class Pilot():

def move(self):

print('Пилоты передвигается верхом')



def attack(self):

print('Пилоты переходит в атаку')



def defend(self):

print('Пилоты отступают')







army = Army()

army.add_soldier(Infantry()) # тут нет ошибки

army.add_soldier(Cavalry()) # тут нет ошибки

army.add_soldier(Infantry()) # тут нет ошибки

army.add_soldier(Cavalry()) # тут нет ошибки

# army.add_soldier(Pilot()) почему тут ошибка?



army.attack()

army.defend()



 
удав лучше
 
Ошибка в 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 defend(self):
print('Кавалерия защищает фланги')


class Pilot(Soldier): # Пилот теперь является подклассом Soldier
def move(self):
print('Пилоты передвигаются верхом')

def attack(self):
print('Пилоты переходят в атаку')

def defend(self):
print('Пилоты отступают')


class Army():
soldats = []

def add_soldier(self, soldier):
Soldier.validatesoldier(soldier)
Army.soldats.append(soldier)

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 не вызывает ошибку

army.attack()
army.defend()
 
Назад
Сверху