Я делаю иерархию вещей (Вещи> Неорганические 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 фабрика классов наследует случайного родителя