Как указать, какой __init__ следует вызывать на основе параметров? - PullRequest
0 голосов
/ 30 апреля 2018

Итак, я недавно начал изучать Python, и сейчас я застрял с задачей, где я должен реализовать UML-диаграмму. Это выглядит так:

UML Diagram

Это в основном моделирующий человек, взрослый, дети и пенсионер. Теперь я застрял в том, что задача состоит в том, что один параметр, который говорит «изменить» (англ. = Возраст), определяет, какой класс должен быть инициализирован. Лицо младше 18 лет (старше 18 лет) является Добрым (англ. = Ребенок). Лицо в возрасте от 18 до 61 года является Erwachsener (англ. = Взрослый), и все, что выше, это Pensionierter (англ. = Пенсионер).

Теперь моя проблема в том, что я не знаю, как реализовать это различие ...

Вот что у меня есть:

class Person:
    def __init__(self, name, male, alter):
        self.name = name
        self.male = male
        self.__alter = alter

    def print_beschreibung(self):
        if self.male:
            print("Ich heiße " + self.name + ", bin männlich,", self.__alter, "Jahre alt")
        else:
            print("Ich heiße " + self.name +  ", bin weiblich,", self.__alter, "Jahre alt")    

    def get_alter(self):
        return self.__alter    

    def set_alter(self, neues_alter):
        self.__alter = neues_alter

class Erwachsener(Person):
    def __init__(self, name, male, alter, lohn, ist_verheiratet, kinder):
        super().__init__(name, male, alter)
        self.__lohn = lohn
        self.ist_verheiratet = ist_verheiratet
        self.kinder = kinder    


peter = Person("Peter Lustig", True, 52)
peter.print_beschreibung()

1 Ответ

0 голосов
/ 30 апреля 2018

Существуют разные способы реализации этого поведения. Самый простой - иметь класс _Person, который совпадает с вашим текущим классом Person:

class _Person:
    def __init__(self, name, male, alter):
        self.name = name
        self.male = male
        self.__alter = alter

    def print_beschreibung(self):
        if self.male:
            print("Ich heiße " + self.name + ", bin männlich,", self.__alter, "Jahre alt")
        else:
            print("Ich heiße " + self.name + ", bin weiblich,", self.__alter, "Jahre alt")

    def get_alter(self):
        return self.__alter

    def set_alter(self, neues_alter):
        self.__alter = neues_alter


class Kind(_Person):
    pass


class Erwachsener(_Person):
    def __init__(self, name, male, alter, lohn, ist_verheiratet, kinder):
        super().__init__(name, male, alter)
        self.__lohn = lohn
        self.ist_verheiratet = ist_verheiratet
        self.kinder = kinder


class Pensionierter(_Person):
    pass

Тогда у вас есть функция Person, которая ведет себя как класс и возвращает соответствующий Erwachsener, Kind или Pensionierter класс:

def Person(*args, **kwargs):
    alter = args[2]
    if alter < 18:
        return Kind(*args, **kwargs)
    elif 18 <= alter <= 61:
        return Erwachsener(*args, **kwargs)
    else:
        return Pensionierter(*args, **kwargs)

Тогда вы можете использовать эту функцию следующим образом:

peter = Person("Peter Lustig", True, 52, 0, False, 0)
print(isinstance(peter, Erwachsener))
peter.print_beschreibung()

Если вы хотите, чтобы Person был классом, вам придется творить магию:

class Person:
    def __new__(cls, *args, **kwargs):
        alter = args[2]
        if alter < 18:
            cls = Kind
        elif alter < 61:
            cls = Erwachsener
        else:
            cls = Pensionierter
        return object.__new__(cls)
     # The rest of the class

Тогда вы можете использовать его, как указано выше:

peter = Person("Peter Lustig", True, 52,0,False,0)
print(isinstance(peter, Erwachsener)) # prints True
peter.print_beschreibung()

Но вы также можете поступить так:

print(isinstance(peter, Person)) # prints True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...