gpt4 book ai didi

python - 如何根据参数指定调用哪个__init__?

转载 作者:行者123 更新时间:2023-12-01 09:29:22 25 4
gpt4 key购买 nike

所以我最近开始学习Python,现在我被一个任务困住了,我应该实现一个UML图。它看起来像这样:

UML Diagram

基本上是模特、成人、 child 和退休人员。现在我陷入困境的部分是任务是一个表示“alter”(eng.=age)的参数定义了应该初始化哪个类。 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()

最佳答案

有多种方法可以实现此行为。最简单的是拥有一个类 _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,它的行为类似于一个类,并返回相应的ErwachsenerKindPensionierter 类:

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

关于python - 如何根据参数指定调用哪个__init__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50099210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com