LINUX.ORG.RU

Python. Подклассы

 , ,


0

2

Задача «Игровой мир».

Дано:

Теперь нужно населить игровой мир различными существами. Ваш гейм-дизайнер придумал сложную разветвленную иерархию существ.

Во-первых, все существа делятся на земных, морских и воздушных. Среди земных существ выделяются тролли и эльфы, среди морских — русалки и сирены, среди воздушных — драконы и пегасы.

Создайте базовый класс Creature, а также его наследников:

  • EarthCreature (с подклассами Troll и Elf),

  • SeaCreature (с подклассами Mermaid и Siren),

  • AirCreature (с подклассами Dragon и Pegasus).

Никаких методов пока реализовывать не нужно, но каждый класс должен содержать атрибут health_points в соответствии с таблицей.

КлассЗначение атрибута health_points
Troll100
Elf80
Mermaid60
Siren75
Dragon120
Pegasus85

Пример работы программы:

x = Elf()
isinstance(x, EarthCreature)  ⇒ True
isinstance(x, Creature)       ⇒ True
x.health_points               ⇒ 80

Я наваял вот такое:

import abc

class Creature(abc.ABC):
    health_points: int

    @abc.abstractmethod
    def __init__(self):
        pass

class EarthCreature(Creature):
    pass

class Troll(EarthCreature):

    def __init__(self) -> None:
        self.health_points: int = 100

class Elf(EarthCreature):

    def __init__(self) -> None:
        self.health_points: int = 80

class SeaCreature(Creature):
    pass

class Mermaid(SeaCreature):

    def __init__(self) -> None:
        self.health_points: int = 60

class Siren(SeaCreature):

    def __init__(self) -> None:
        self.health_points: int = 75

class AirCreature(Creature):
    pass

class Dragon(AirCreature):

    def __init__(self) -> None:
        self.health_points: int = 120

class Pegasus(AirCreature):

    def __init__(self) -> None:
        self.health_points: int = 85

Но данный код проваливает автоматическую проверку. Вываливается

Ваш код не прошел один или несколько скрытых тестов. Ваш код должен пройти все тесты, чтобы получить какие-либо оценки. Попробуй еще раз.

Прошу знатоков ООП в Python подбросить мне какие-либо умные мысли.


Суньте это в статические поля.

Декораторы какие то, аннотирование типов… зачем?!

ЗЫ да, декораторов нет - показалось, но много лишних букоф.

class Creature:pass
class Elf(Creature): xxx = 123
AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)

Прошу знатоков ООП в Python подбросить мне какие-либо умные мысли.

закончить школу на хорошо и отлично. поступить в институт, стать дипломированным специалистом, и всех этих мармаид и эльфов снимет как рукой

alysnix ★★★
()

@czan

Вы сделали инициализатор абстрактным, чтобы гарантировать, что в подклассах устанавливается значение health_points? Но ведь это никак не гарантируется, ибо что мне помешает сделать вот так?

class Creature(abc.ABC):
    health_points: int

    @abc.abstractmethod
    def __init__(self):
        pass

class EarthCreature(Creature):
    pass

class Troll(EarthCreature):

    def __init__(self) -> None:
        self.fuckit: int = 100

если вы хотите решение в виде более-менее классического ООП, то это будет выглядеть как-то так

class Creature(abc.ABC):
    
    @property
    def health_points(self):
       return self.get_health_points()

    @abc.abstractmethod
    def get_health_points(self):
        pass
FishHook
()
Последнее исправление: FishHook (всего исправлений: 1)

Прошу знатоков ООП в Python подбросить мне какие-либо умные мысли.

Тренируйся физически. Программирование - не твоё, сессию ты не сдашь, а на службе умение быстро бегать/таскать тяжести и общая спортивная подготовка могут спасти тебе жизнь.

peregrine ★★★★★
()

Всё оказалось значительно проще.

class Creature:    
    pass

class EarthCreature(Creature):
    pass

class Troll(EarthCreature):
    health_points = 100

class Elf(EarthCreature):
    health_points = 80

class SeaCreature(Creature):
    pass

class Mermaid(SeaCreature):
    health_points = 60

class Siren(SeaCreature):
    health_points = 75

class AirCreature(Creature):
    pass

class Dragon(AirCreature):
    health_points = 120

class Pegasus(AirCreature):
    health_points = 85

Вот так проходит тесты. Всем спасибо!

czan
() автор топика