繁体   English   中英

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

[英]How to set an instance of base class as attribute of child class?

我试图将基类(人类)的实例设置为子类(母亲)的属性(婴儿),但是发生了意外的行为。 在我的示例中,我期望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

注意:我正在使用Python 3.5.2

问题

您正在根据要初始化的对象的type设置名称。

mother = Mother("Mary", "Tom") ,属性Human.name已通过Mother.__init__第2行设置为'Mary'

实例mothermother.baby都没有属性name

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

此外, Mother类也缺少该属性:

>>> 'name' in vars(Mother)
>>> False

属性name仅在 Human上设置:

>>> vars(Human)['name']
>>> 'Mary'

因此, mother.name退回到Human.name因为在实例mother或类Mother上找不到属性name (当在实例和类级别上查找失败时,Python会尝试在基类中搜索适当的属性。)

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


如何修复

您要在此处在实例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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM