Унаследовать случайный класс без переопределения при создании - PullRequest
0 голосов
/ 10 апреля 2020

Я делаю иерархию вещей (Вещи> Неорганические c, Органические c> Растения, Существа> Собаки и др. c.), Чтобы узнать о классах и наследовании.

Я пытаюсь реализовать секс, но мое нынешнее решение довольно хакерское. В настоящее время он определяется только внутри класса существа, а затем функции зависят от результата. Я хочу, чтобы секс был более фундаментальным аспектом - помогал определить размер, вес и какие методы иметь. Почему мужское существо должно иметь методы для беременности и родов? Вот что у меня сейчас (дополнительные атрибуты были опущены, чтобы было легче читать):

 class Creature(Organic):

    sex_pool = ('male', 'female')
    weight_range = {'male': (0,0), 'female': (0,0)}

    def __init__(self):
        Creature.population += 1
        super().__init__()
        self._sex = random.choice(self.sex_pool)
        self.weight = self.rand_normal(self.weight_range[self._sex][0],self.weight_range[self._sex][1])
        self._pregnant = False if self._sex is 'female' else None

    @property
    def sex(self):
        return self._sex

    @property
    def pregnant(self):
        return self._pregnant

    @pregnant.setter
    def pregnant(self, boolean):
        if self._sex is 'female':
            if type(boolean) is bool:
                self._pregnant = boolean
            else:
                print("pregnancy attribute must be a boolean value")
        else:
            print("only females have a pregnancy attribute")

Вместо этого я бы хотел, чтобы Существа наследовали класс Sex, который случайным образом выбирает класс Male или Female. У меня есть класс Sex, который при инициации становится мужчиной или женщиной, но, конечно, я не могу позволить своему классу существ наследовать его, потому что он также перезапишет класс существа:

class Male:
    def __init__(self):
        self._sex = 'male'

class Female:
    def __init__(self):
        self._sex = 'female'
        self._pregnant = False

    @property
    def pregnant(self):
        return self._pregnant

    @pregnant.setter
    def pregnant(self, boolean):
        if type(boolean) is bool:
            self._pregnant = boolean
        else:
            print("pregnancy attribute must be a boolean value")
class Sex():
    def __init__(self):
        sex = random.choice((Male, Female))
        self.__class__ = sex

Я тоже пробовал это, но это заканчивает тем, что делает класс Sex всегда женским или мужским (и не наследует Organi c должным образом, но я полагаю, что это другой вопрос, который я должен быть в состоянии выработать):

class Sex(random.choice((Male,Female))):
    def __init__(self):
        super().__init__()

class Creature(Sex, Organic):
...

Или , есть ли способ создать класс Sex в init существа и добавить свойства / методы в класс существа? Но это выглядит как довольно хакерский способ «фальсифицировать» наследование, и даже свойства класса «мужской», «женский» и «пол» все равно будут потеряны (я думаю).

Я думаю, что я хочу вернуть некоторую инструкцию по наследованию, а не экземпляр класса в сексе, но я не уверен, действительно ли это возможно.

Я перебрал тщательный и, казалось бы, связанный пост SO, но все примеры перезаписывают наследующий класс, который не работает. python фабрика классов наследует случайного родителя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...