我试图将基类(Human)的实例设置为子类(Mother)的属性(baby),但得到了意外的行为。
在我的示例中,我希望print(mother.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

注意:Am使用Python3.5.2

最佳答案

问题
您正在初始化的对象的type上设置名称。
mother = Mother("Mary", "Tom")之后,属性Human.name通过'Mary'的第2行设置为Mother.__init__
实例mothermother.baby都没有属性name

>>> vars(mother)
>>> {}
>>> vars(mother.baby)
>>> {}

此外,类Mother也缺少属性:
>>> 'name' in vars(Mother)
>>> False

属性name仅在类Human上设置:
>>> vars(Human)['name']
>>> 'Mary'

因此,mother.name返回到Human.name,因为在实例name或类mother上找不到属性Mother。(当在实例和类级别上的查找失败时,Python尝试在基类中搜索适当的属性。)
mother.baby.name也返回到Human.name,因为在实例name中找不到mother.baby,而是在该实例的类(Human)上。
如何修复
要在此处设置实例(self)的属性。
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)

因为这样可以避免对基类的名称进行硬编码。

关于python - 如何将基类的实例设置为子类的属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53361804/

10-10 19:52