Существуют разные способы реализации этого поведения. Самый простой - иметь класс _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