如何根据参数指定调用哪个__init__?
How to specify which __init__ should be called based on the parameters?
所以我最近开始学习 python,现在我被困在一项任务中,我应该在其中实现 UML 图。
它看起来像这样:
基本上是建模人物,成人,儿童和退休人员。现在我被卡住的部分是任务是一个参数 "alter" (eng. = age) 定义应该初始化哪个 class 。未满 18 岁的人 (alter < 18) 是一种 (eng. = child)。 18 到 61 岁之间的人是 Erwachsener(eng. = 成人),以上所有都是 Pensionierter(eng. = 退休人员)。
现在我的问题是我不知道如何实现这种区分...
这是我目前的情况:
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()
有多种方法可以实现此行为。最简单的是 class _Person
与您当前的 Person
class:
相同
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
,它的行为类似于 class 和 returns 对应的 Erwachsener
、Kind
或 Pensionierter
class:
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,你将不得不施展魔法:
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
所以我最近开始学习 python,现在我被困在一项任务中,我应该在其中实现 UML 图。 它看起来像这样:
基本上是建模人物,成人,儿童和退休人员。现在我被卡住的部分是任务是一个参数 "alter" (eng. = age) 定义应该初始化哪个 class 。未满 18 岁的人 (alter < 18) 是一种 (eng. = child)。 18 到 61 岁之间的人是 Erwachsener(eng. = 成人),以上所有都是 Pensionierter(eng. = 退休人员)。
现在我的问题是我不知道如何实现这种区分...
这是我目前的情况:
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()
有多种方法可以实现此行为。最简单的是 class _Person
与您当前的 Person
class:
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
,它的行为类似于 class 和 returns 对应的 Erwachsener
、Kind
或 Pensionierter
class:
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,你将不得不施展魔法:
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