Python 如何将基类的实例设置为子类的属性?

Python 如何将基类的实例设置为子类的属性?,python,Python,我试图将基类Human的一个实例设置为child类Mother的属性baby,但得到了意外的行为。 在我的示例中,我希望printmother.baby.name打印Tom 如何将基类的实例设置为子类的属性 我非常确定我需要对python中的类有更深入的理解,但是我在这里缺少什么呢 class Human: def __init__(self, name): Human.name = name class Mother(Human): def __init__(

我试图将基类Human的一个实例设置为child类Mother的属性baby,但得到了意外的行为。 在我的示例中,我希望printmother.baby.name打印Tom

如何将基类的实例设置为子类的属性

我非常确定我需要对python中的类有更深入的理解,但是我在这里缺少什么呢

class Human:
    def __init__(self, name):
        Human.name = name

class Mother(Human):
    def __init__(self, name_mother, name_baby):
        Mother.baby = Human(name_baby)
        Human.__init__(self, name_mother)

mother = Mother("Mary", "Tom")

print(mother.name)
print(mother.baby.name)
输出:

Mary
Mary
注意:我正在使用Python 3.5.2解决这个问题

您正在设置要初始化的对象类型的名称

在mother=MotherMary之后,Tom属性Human.name已通过mother的第2行设置为“Mary”。\uuuu init\uuuu

实例mother和mother.baby都没有属性名称:

此外,类母亲也缺少以下属性:

>>> 'name' in vars(Mother)
>>> False
仅在类Human上设置了属性名称:

因此,mother.name返回到Human.name,因为在实例母亲或类母亲上找不到属性名称。当在实例和类级别上的查找失败时,Python尝试在基类中搜索适当的属性

mother.baby.name也返回到Human.name,因为在实例mother.baby中找不到name,但在该实例Human的类中找不到name

如何修复它

您想在这里设置实例self的属性

输出:

Mary
Tom
我也换了线路

Human.__init__(self, name_mother)


因为这避免了对基类名称进行硬编码。

如果这纯粹是为了学习,那就太好了!如果涉及其他目的,我建议查找组合而不是继承。谢谢,我将查看组合而不是继承:
class Human:
    def __init__(self, name):
        self.name = name

class Mother(Human):
    def __init__(self, name_mother, name_baby):
        self.baby = Human(name_baby)
        super().__init__(name_mother)

mother = Mother("Mary", "Tom")

print(mother.name)
print(mother.baby.name)
Mary
Tom
Human.__init__(self, name_mother)
super().__init__(name_mother)